如何结束的AsyncTask onBack $ P $(PSS) [英] How to end AsyncTask onBackPress()

查看:158
本文介绍了如何结束的AsyncTask onBack $ P $(PSS)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何停止的AsyncTask在Android回preSS我想停止这种活动,这样,当它返回到previous活动这个活动是完全封闭的。

本次活动做它在后台工作,因为这是应该做的,我的问题是,当我们点击了Android后退按钮这项活动完全停止,回到第一个活动我没有somne​​搜索和才知道应该在AsyncTask的背面preSS停止
我试过,但多年平均值II似乎工作怎么能这样在下面的code来完成

 包com.Blog.blogname;进口的java.io.File;
进口java.io.FileOutputStream中;
进口java.io.IOException异常;
进口java.io.ObjectOutputStream中;进口android.app.Activity;
进口android.app.AlertDialog;
进口android.content.Context;
进口android.content.DialogInterface;
进口android.content.Intent;
进口android.net.ConnectivityManager;
进口android.os.AsyncTask;
进口android.os.Bundle;
进口android.widget.Toast;进口com.Blog.blogname.parser.DOMParser;
进口com.Blog.blogname.parser.RSSFeed;公共类SplashActivity延伸活动{    //字符串RSSFEEDURL =htt​​p://feeds.blogname.com/blogname?format=xml;
    //字符串RSSFEEDURL =htt​​p://blogname.blogname.com/feeds/posts/default?alt=rss;
    // INT位置= i.getExtras()调用getInt(位置);
    //的String []国家= i.getStringArrayExtra(国家);    //Toast.makeText(this,i.getStringArrayExtra(国家)+入选,Toast.LENGTH_LONG).show();
    //字符串RSSFEEDURL =htt​​p://blogname.blogspot.com//feeds/posts/default/-/Awards?alt=rss;
    //字符串RSSFEEDURL =htt​​p://blogname.blogspot.com//feeds/posts/default/-/country[position]?alt=rss;
    RSSFeed中饲料;
    字符串文件名;    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);        的setContentView(R.layout.splash);        文件名=TDRSSFeed.td;
        意向I = getIntent();
        。INT位置= i.getExtras()调用getInt(位置);
        的String []国家= i.getStringArrayExtra(国家);
// //公共字符串RSSFEEDURL =htt​​p://blogname.blogspot.com//feeds/posts/default/-/Awards?alt=rss;
        Toast.makeText(getApplicationContext(),国家[位置],Toast.LENGTH_SHORT).show();
        //Toast.makeText(getApplicationContext(),国家[位置],Toast.LENGTH_SHORT).show();
        文件feedFile = getBaseContext()getFileStreamPath(文件名)。        ConnectivityManager conMgr =(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        如果(conMgr.getActiveNetworkInfo()== NULL){            //没有连接。检查供文件存在
            如果(!feedFile.exists()){                //无连接和放大器;饲料文件不存在:显示警报退出
                //&安培;检查连接
                AlertDialog.Builder建设者=新AlertDialog.Builder(本);
                builder.setMessage(
                        无法到达服务器,\\ n请检查您的连接。)
                        .setTitle(TD RSS阅读器)
                        .setCancelable(假)
                        .setPositiveButton(退出,
                                新DialogInterface.OnClickListener(){
                                    @覆盖
                                    公共无效的onClick(DialogInterface对话框,
                                            INT ID){
                                        完();
                                    }
                                });                AlertDialog警报= builder.create();
                alert.show();
            }其他{                //没有connectivty和文件存在:从文件中读取饲料
                吐司面包= Toast.makeText(这一点,
                        没有连接!
                        Toast.LENGTH_LONG);
                toast.show();
                //饲料= ReadFeed(文件名);
                startLisActivity(饲料);
            }        }其他{            //连接 - 开始解析
            新AsyncLoadXMLFeed()执行();        }    }    私人无效startLisActivity(RSSFeed中饲料){        束束=新包();
        bundle.putSerializable(饲料,饲料);        //启动活动列表
        意向意图=新意图(SplashActivity.this,ListActivity.class);
        intent.putExtras(包);
        startActivity(意向);
        overridePendingTransition(R.anim.slide_in,R.anim.slide_out);
        //杀了本次活动
        完();    }    私有类AsyncLoadXMLFeed扩展的AsyncTask<太虚,太虚,太虚> {        @覆盖
        保护无效doInBackground(虚空...... PARAMS){            //获取饲料
            的DOMParser myParser =新的DOMParser();
            意向I = getIntent();
            。INT位置= i.getExtras()调用getInt(位置);
            的String []国家= i.getStringArrayExtra(国家);
            //饲料= myParser.parseXml(RSSFEEDURL);
            //饲料= myParser.parseXml(http://blogname.blogspot.com//feeds/posts/default/-/Awards?alt=rss);
            饲料= myParser.parseXml(http://blogname.blogspot.com//feeds/posts/default/-/+国家[位置] +ALT = RSS?);
            如果(进料=空&放大器;!&放大器; feed.getItemCount()大于0)
                WriteFeed(饲料);
            返回null;        }        @覆盖
        保护无效onPostExecute(虚空结果){
            super.onPostExecute(结果);            startLisActivity(饲料);
        }
    }    //方法写馈送到文件
    私人无效WriteFeed(RSSFeed中的数据){        FileOutputStream中FOUT = NULL;
        ObjectOutputStream的OSW = NULL;        尝试{
            FOUT = openFileOutput(文件名,MODE_PRIVATE);
            OSW =新的ObjectOutputStream(FOUT);
            osw.writeObject(数据);
            osw.flush();
        }        赶上(例外五){
            e.printStackTrace();
        }        最后{
            尝试{
                fOut.close();
            }赶上(IOException异常五){
                e.printStackTrace();
            }
        }
    }    //方法从文件中读取进
//私有的RSSFeed ReadFeed(字符串FName参数){
//
//的FileInputStream FIN = NULL;
// ObjectInputStream的ISR = NULL;
//
// RSSFeed中_feed = NULL;
//文件feedFile = getBaseContext()getFileStreamPath(文件名)。
//如果(!feedFile.exists())
//返回null;
//
//尝试{
// FIN = openFileInput(FNAME);
// ISR =新的ObjectInputStream(FIN);
//
// _feed =(RSSFeed中)isr.readObject();
//}
//
//赶上(例外五){
// e.printStackTrace();
//}
//
// {最后
//尝试{
// fIn.close();
//}赶上(IOException异常五){
// e.printStackTrace();
//}
//}
//
//返回_feed;
//
//}// @覆盖
//公共无效onBack pressed()
// {
//完成();
//}
// @覆盖
//公共无效onBack pressed(){
//如果(条件){
// super.onBack pressed(); //正常行为
//}其他{
// startLisActivity(饲料);
//}
//}    //私有静态最终诠释TIME_INTERVAL = 2000; //#毫秒,所需时间两回presses之间传递。
    //私人长期mBack pressed;    // @覆盖
//公共无效onBack pressed()
// {
//如果(mBack pressed + TIME_INTERVAL> System.currentTimeMillis的())
// {
// super.onBack pressed();
//返回;
//}
//否则,如果(mBack pressed + TIME_INTERVAL< System.currentTimeMillis的()){Toast.makeText(getBaseContext(),按返回键,以退出,Toast.LENGTH_SHORT).show(); }
//其他{
// // startLisActivity(饲料);
// @覆盖
//保护无效onPostExecute(虚空结果){
// super.onPostExecute(结果);
//
// startLisActivity(饲料);
//}
        //}
     // mBack pressed = System.currentTimeMillis的();
    //}    @覆盖
//公共无效onBack pressed(){
// //DOMParser().cancel(true);
// AsyncLoadXMLFeed.cancel(真);
// //如果你想完成您可以使用下面code活动
//完成();
//}
//公共无效onBack pressed()
// {
//
// .cancel(真);
//}//公共无效onBack pressed(){
//
//
//如果(AsyncLoadXMLFeed!= NULL)如果(AsyncLoadXMLFeed.getStatus()== Status.RUNNING)AsyncLoadXMLFeed.cancel(真);
//完成();
// //overridePendingTransition(R.anim.zoom_enter,R.anim.zoom_exit);
//}
}


解决方案

要获取取消活动的onDestroy()

 公共SplashActivity延伸活动{   私人AsyncLoadXMLFeed装载机;   @覆盖
   公共无效的onCreate(包B){
       super.onCreate(二);       ...       //连接 - 开始解析
       装载机=新AsyncLoadXMLFeed();
       loader.execute();
   }
   @覆盖
   公共无效的onDestroy(){
      super.onDestroy();      //取消任务
      loader.cancel(真);
   }
}

Android官方文件说:


  

一个任务可以在任何时候通过调用取消(布尔)被取消。
  调用此方法将导致isCancelled后续调用()来
  返回true。调用此方法后,onCancelled(对象),而不是
  onPostExecute(对象)会后调用
  doInBackground(Object []对象)的回报。为了确保任务被取消
  尽可能快的,您应经常检查返回值
  如果可能的话isCancelled()定期从doInBackground(对象[]),
  (内部例如一个环路。)


how to stop asynctask on android backpress i want to stop this activity so that when it goes back to previous activity this activity is completely closed

this activity does its work in background , as it is supposed to do, my problem is when we click the android back button this activity should completely stop and go back to first activity i did somne search and came to know the asynctask should be stopped on back press i tried that but ii doesnot seem to work how can this be done in the below code

 package com.Blog.blogname;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.Toast;

import com.Blog.blogname.parser.DOMParser;
import com.Blog.blogname.parser.RSSFeed;

public class SplashActivity extends Activity {



    //String RSSFEEDURL = "http://feeds.blogname.com/blogname?format=xml";
    //String RSSFEEDURL = "http://blogname.blogname.com/feeds/posts/default?alt=rss";
    //int position = i.getExtras().getInt("position");
    //String[] country = i.getStringArrayExtra("country");

    //Toast.makeText(this, i.getStringArrayExtra("country") + "was selected" , Toast.LENGTH_LONG).show();
    //String RSSFEEDURL = "http://blogname.blogspot.com//feeds/posts/default/-/Awards?alt=rss";
    //String RSSFEEDURL = "http://blogname.blogspot.com//feeds/posts/default/-/country[position]?alt=rss";
    RSSFeed feed;
    String fileName;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.splash);

        fileName = "TDRSSFeed.td";
        Intent i = getIntent();
        int position =  i.getExtras().getInt("position");
        String[] country = i.getStringArrayExtra("country");
//      //public String RSSFEEDURL = "http://blogname.blogspot.com//feeds/posts/default/-/Awards?alt=rss";
        Toast.makeText(getApplicationContext(), country[position], Toast.LENGTH_SHORT).show();
        //Toast.makeText(getApplicationContext(), country[position], Toast.LENGTH_SHORT).show();
        File feedFile = getBaseContext().getFileStreamPath(fileName);

        ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        if (conMgr.getActiveNetworkInfo() == null) {

            // No connectivity. Check if feed File exists
            if (!feedFile.exists()) {

                // No connectivity & Feed file doesn't exist: Show alert to exit
                // & check for connectivity
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage(
                        "Unable to reach server, \nPlease check your connectivity.")
                        .setTitle("TD RSS Reader")
                        .setCancelable(false)
                        .setPositiveButton("Exit",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        finish();
                                    }
                                });

                AlertDialog alert = builder.create();
                alert.show();
            } else {

                // No connectivty and file exists: Read feed from the File
                Toast toast = Toast.makeText(this,
                        "No connectivity!",
                        Toast.LENGTH_LONG);
                toast.show();
                //feed = ReadFeed(fileName);
                startLisActivity(feed);
            }

        } else {

            // Connected - Start parsing
            new AsyncLoadXMLFeed().execute();

        }

    }

    private void startLisActivity(RSSFeed feed) {

        Bundle bundle = new Bundle();
        bundle.putSerializable("feed", feed);

        // launch List activity
        Intent intent = new Intent(SplashActivity.this, ListActivity.class);
        intent.putExtras(bundle);
        startActivity(intent);
        overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
        // kill this activity
        finish();

    }

    private class AsyncLoadXMLFeed extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            // Obtain feed
            DOMParser myParser = new DOMParser();
            Intent i = getIntent();
            int position =  i.getExtras().getInt("position");
            String[] country = i.getStringArrayExtra("country");
            //feed = myParser.parseXml(RSSFEEDURL);
            //feed = myParser.parseXml("http://blogname.blogspot.com//feeds/posts/default/-/Awards?alt=rss");
            feed = myParser.parseXml("http://blogname.blogspot.com//feeds/posts/default/-/" + country[position] + "?alt=rss");
            if (feed != null && feed.getItemCount() > 0)
                WriteFeed(feed);
            return null;

        }



        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            startLisActivity(feed);
        }


    }

    // Method to write the feed to the File
    private void WriteFeed(RSSFeed data) {

        FileOutputStream fOut = null;
        ObjectOutputStream osw = null;

        try {
            fOut = openFileOutput(fileName, MODE_PRIVATE);
            osw = new ObjectOutputStream(fOut);
            osw.writeObject(data);
            osw.flush();
        }

        catch (Exception e) {
            e.printStackTrace();
        }

        finally {
            try {
                fOut.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // Method to read the feed from the File
//  private RSSFeed ReadFeed(String fName) {
//
//      FileInputStream fIn = null;
//      ObjectInputStream isr = null;
//
//      RSSFeed _feed = null;
//      File feedFile = getBaseContext().getFileStreamPath(fileName);
//      if (!feedFile.exists())
//          return null;
//
//      try {
//          fIn = openFileInput(fName);
//          isr = new ObjectInputStream(fIn);
//
//          _feed = (RSSFeed) isr.readObject();
//      }
//
//      catch (Exception e) {
//          e.printStackTrace();
//      }
//
//      finally {
//          try {
//              fIn.close();
//          } catch (IOException e) {
//              e.printStackTrace();
//          }
//      }
//
//      return _feed;
//
//  }

//  @Override
//  public void onBackPressed()
//  {
//      finish();
//  }
//  @Override
//  public void onBackPressed(){
//      if(condition){
//          super.onBackPressed(); //Normal behaviour
//      } else {
//          startLisActivity(feed);
//      }
//  }

    //private static final int TIME_INTERVAL = 2000; // # milliseconds, desired time passed between two back presses.
    //private long mBackPressed;

    //@Override
//  public void onBackPressed()
//  {
//      if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis()) 
//      { 
//          super.onBackPressed(); 
//          return;
//      }
//      else if(mBackPressed + TIME_INTERVAL < System.currentTimeMillis()){ Toast.makeText(getBaseContext(), "Tap back button in order to exit", Toast.LENGTH_SHORT).show(); }
//      else {
//          //startLisActivity(feed);
//          @Override
//          protected void onPostExecute(Void result) {
//              super.onPostExecute(result);
//                  
//              startLisActivity(feed);
//          }
        //}
     //   mBackPressed = System.currentTimeMillis();


    //}

    @Override
//  public void onBackPressed() {
//      //DOMParser().cancel(true);
//      AsyncLoadXMLFeed.cancel(true);
//      // If you want to finish the activity you can use below code
//       finish(); 
//  }
//  public void onBackPressed()
//  {
//
//      .cancel(true);
//  }

//public void onBackPressed(){
//        
//          
//        if (AsyncLoadXMLFeed != null)   if (AsyncLoadXMLFeed.getStatus() == Status.RUNNING)   AsyncLoadXMLFeed.cancel(true);
//        finish();
//        //overridePendingTransition(R.anim.zoom_enter,R.anim.zoom_exit);
//  }
}

解决方案

Simply call cancel in activities onDestroy()

public SplashActivity extends Activity {

   private AsyncLoadXMLFeed loader;

   @Override
   public void onCreate(Bundle b){
       super.onCreate(b);

       ...

       // Connected - Start parsing
       loader = new AsyncLoadXMLFeed();
       loader.execute();
   }


   @Override
   public void onDestroy(){
      super.onDestroy();

      // Cancel the task
      loader.cancel(true);
   }    
}

The official android documentation says:

A task can be cancelled at any time by invoking cancel(boolean). Invoking this method will cause subsequent calls to isCancelled() to return true. After invoking this method, onCancelled(Object), instead of onPostExecute(Object) will be invoked after doInBackground(Object[]) returns. To ensure that a task is cancelled as quickly as possible, you should always check the return value of isCancelled() periodically from doInBackground(Object[]), if possible (inside a loop for instance.)

这篇关于如何结束的AsyncTask onBack $ P $(PSS)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆