应用程序关闭后如何在片段中停止AsyncTask

时间:2013-01-08 14:12:22

标签: android android-asynctask android-fragments android-activity

如何在关闭应用程序后停止片段类中的AsyncTask。

以下是我的情况:

MainActivity类

public class MainActivity extends FragmentActivity {

}

BaseFragment类由Fragment

扩展
public class BaseFragment extends Fragment {
    public MainActivity mActivity;


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

        mActivity       =   (ChatActivity)this.getActivity();

    }

    public boolean onBackPressed(){
        return false;
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data){

    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }


}

片段类

public class Fragment1 extends BaseFragment{


private  Update  task;
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        toCallAsynchronous();

        return inflater.inflate(R.layout.activity_online_korisnici, container,
                false);
    }


     public void toCallAsynchronous() {
            final Handler handler = new Handler();
            Timer timer = new Timer();
            TimerTask doAsynchronousTask = new TimerTask() {       
                @Override
                public void run() {
                    handler.post(new Runnable() {
                        public void run() {       
                            try {
                             task =new Update();

                                // PerformBackgroundTask this class is the class that extends AsynchTask 
                                task.execute("");
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                            }
                        }
                    });
                }
            };
            timer.schedule(doAsynchronousTask, 0, 5000); //execute in every 50000 ms
        }




   private class Update extends AsyncTask<Object, Object, List<Object>>{

    @Override
        protected List<Object> doInBackground(Object... params) {

                 }

@Override
        protected void onPostExecute(List<Object> result) {


}

   }


}

我认为这可以在 MainActivity - &gt; onPause()方法中完成,但是如何。

3 个答案:

答案 0 :(得分:6)

您可以使用Fragment的onPause()方法。当片段不再恢复时调用它。这通常与Activity.onPause相关,包含Activity的生命周期。

@Override
public void onPause() {
    super.onPause();
    task.cancel();
}

更新: 如果您在TabHost下,并且按下不同的选项卡时片段暂停,则可以这样做

在您的活动中存储片段ID或标签

实施一种方法来停止碎片中的任务

public void onActivityPause() {
    task.cancel();
}

在你的活动onPause()

@Override
protected void onPause() {
    super.onPause();
    FragmentManager fm = getFragmentManager();
    for (int id : ids) {
        Fragment f = fm.findFragmentById(id);
        try {
            Method stop = f.getClass().getMethod("onActivityPause");
            close.invoke(f);
        } catch (Exception e) {}
    }
}

但我不会使用TabHost,它已被弃用。如果需要支持v4版本,请考虑使用ActionBar或ActionBarSherlock。

答案 1 :(得分:3)

task.cancel()会这样做。请务必经常检查isCancelled()以及onBackground()中的onPostExecute(),以避免访问/更新不再存在的用户界面。

答案 2 :(得分:-1)

我有类似的问题 - 基本上我是在用户销毁活动后在异步任务中获得NPE。在研究Stack Overflow上的问题之后,我采用了以下解决方案:

布尔运行;

public void onActivityCreated(Bundle savedInstanceState){

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


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

    running=false;
    ...
}

然后,我在异步代码中定期检查“是否正在运行”。我有压力测试这个,我现在无法“打破”我的活动。这完美地工作,并且具有比我在SO上看到的一些解决方案更简单且更不容易出错的优点。