Android 如何在应用程序关闭后停止片段中的异步任务

Android 如何在应用程序关闭后停止片段中的异步任务,android,android-asynctask,android-fragments,android-activity,Android,Android Asynctask,Android Fragments,Android Activity,如何在关闭应用程序后停止片段类中的AsyncTask 以下是我的情况: 主要活动类 BaseFragment类按片段扩展 片段类 我认为这可以在MainActivity->onPause方法中完成,但是如何完成。task.cancel可以完成。确保在onBackground和onPostExecute中包含要取消的频繁检查,以避免访问/更新不再存在的UI。任务。取消将执行此操作。确保在onBackground和onPostExecute中包含要取消的频繁检查,以避免访问/更新不再存在的UI。您可

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

以下是我的情况:

主要活动类

BaseFragment类按片段扩展

片段类


我认为这可以在MainActivity->onPause方法中完成,但是如何完成。

task.cancel可以完成。确保在onBackground和onPostExecute中包含要取消的频繁检查,以避免访问/更新不再存在的UI。

任务。取消将执行此操作。确保在onBackground和onPostExecute中包含要取消的频繁检查,以避免访问/更新不再存在的UI。

您可以使用片段的onPause方法。当片段不再恢复时调用它。这通常和包含活动的生命周期的Activity.onPause相关联

@Override
public void onPause() {
    super.onPause();
    task.cancel();
}
更新: 如果您在TabHost下,并且当按下不同的选项卡时片段被暂停,那么您可以这样做

在活动中存储片段id或标记

实现一种方法来停止片段中的任务

public void onActivityPause() {
    task.cancel();
}
在你的活动中暂停

@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版本,请考虑使用ActoBar或ActoBaseSelcod。

可以使用OnpStIp方法的片段。当片段不再恢复时调用它。这通常和包含活动的生命周期的Activity.onPause相关联

@Override
public void onPause() {
    super.onPause();
    task.cancel();
}
更新: 如果您在TabHost下,并且当按下不同的选项卡时片段被暂停,那么您可以这样做

在活动中存储片段id或标记

实现一种方法来停止片段中的任务

public void onActivityPause() {
    task.cancel();
}
在你的活动中暂停

@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版本,请考虑使用ActoBar或ActAsBalSelCub。

< P>我也遇到了类似的问题——本质上,在用户破坏了活动之后,我在异步任务中得到了NPE。在研究了堆栈溢出问题后,我采用了以下解决方案:

布尔运算

ActivityCreated Bundle savedInstanceState上的公共无效{

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


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

    running=false;
    ...
}

然后,我检查我的异步代码是否定期运行。我已经对其进行了压力测试,现在无法中断我的活动。与我在上面看到的一些解决方案相比,这种方法工作得非常好,并且具有更简单、更不容易出错的优点。

我也遇到了类似的问题-本质上,我在使用后在异步任务中得到了一个NPEr破坏了活动。在研究堆栈溢出问题后,我采用了以下解决方案:

布尔运算

ActivityCreated Bundle savedInstanceState上的公共无效{

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


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

    running=false;
    ...
}

然后,我检查我的异步代码中是否周期性地运行。我已经进行了压力测试,现在我不能中断我的活动。这是完美的,它比我看到的一些解决方案更简单、更容易出错。

我会考虑把它放在销毁中,可能在OnDelCH中。我会考虑把它放进去。在onDestroy中,可能是在OnDetch中。不太热。对运行的变量的访问不同步,甚至volatile也可以工作。更好的是,使用AsyncTask.isCancelled。感谢G.Blake Meike。我已将运行定义为volatile,并将调查AsyncTask.isCancelled。不太热。对运行的变量的访问不同步,甚至volatile可以工作。更好的方法是使用AsyncTask.isCancelled。感谢G.Blake Meike。我已经将运行定义为volatile,并将调查AsyncTask.isCancelled。