如何在关闭应用程序后停止片段类中的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()方法中完成,但是如何。
答案 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上看到的一些解决方案更简单且更不容易出错的优点。