2012-06-25 82 views
15

我已将AsyncTasks用于我的应用程序,以便懒惰地下载和更新UI。Android AsyncTasks如何检查活动是否仍在运行

现在我AsyncTasks更新UI真正简单:

protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     gender.setText(values[0]); 
} 

我的问题是如何检查其性别TextView从呈现的活动,仍然是可用的?

如果没有,我会得到一个错误,我的应用程序将关闭。

+0

没有把握可以尝试,如果(空==性别&& gender.isShown()) –

回答

25

您可以取消该活动的的onDestroy

@Override 
protected void onDestroy() { 
    asynctask.cancel(true); 
    super.onDestroy(); 
} 

您的AsyncTask并进行更改时您检查您的AsyncTask是否已经取消(活动破坏)或不

protected void onProgressUpdate(String... values) { 
    super.onProgressUpdate(values); 
    if(!isCancelled()) { 
     gender.setText(values[0]); 
    } 
} 
+0

不错。但是没有保证每次都会调用破坏者。 (以下参考链接)。你如何应对? https://stackoverflow.com/a/4449988/3265444 – Ajji

0

不应该

if (gender) { 
    gender.setText(values[0]); 
} 

够吗?

+0

你服用的(空==性别)?即使如此,不仅仅这样还不够,还不够, –

+1

不,这还不够。该活动可能已完成,但性别可能仍然为非空值,并且尝试引用它将失败,因为视图/窗口不再处于活动状态。 – AgileYogi

1

尽管我从来没有面对过这种情况,我会尽力回答你的问题。

在你的情况下,你需要验证传递给AsyncTaskContext

您可以执行验证

if(null!=mContext) //Activity still exist!! 
{ 
    gender.setText(values[0]); 
} 
else //Activity is destroyed 
{ 
    //Take appropriate action!! 
} 

优点进行,如果活动是由你达到这个说法的时候销毁,你Context将自动成为null,你可以处理的情况。

+2

这不行。因为你坚持参考活动,它不会被忽略。它会变得无效,但异步任务将继续参考活动。 – uthark

1

我会坚持让你如果你的Activity没有运行,你为什么不取消AsyncTask? 这将是一个更好和可行的解决方案。如果你的应用程序运行,说你从一个活动移动到另一个,那么它不会给出错误AFAIK。

但是,我还是坚持要取消的AsyncTask然后找你的活动没有运行,你可以检查的AsyncTask运行与否,

if(task != null && task.equals(AsyncTask.Status.RUNNING)) 
task.cancel(true); 
2

尝试

if (!isFinishing()) { 
    gender.setText(values[0]); 
} 
5

我也有类似问题 - 基本上我是在用户销毁碎片后在异步任务中获得NPE。研究对堆栈溢出问题后,我采取了以下解决方案:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


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

    running=false; 
    ... 
} 

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

+0

非常感谢!我最终会让它工作! – sshashank124

+1

这很简单,真的很有意义:)如果有人想着'volatile'关键字,请阅读:http://stackoverflow.com/a/107040/4331787 –

1

Android开发者提出一个培训this部分,保持一个WeakReference需要任务已经完成,并检查引用null使用它之前之后进行更新UI元素。这不仅有助于检查用户界面是否仍然存在,还可以防止用户界面元素被垃圾收集。

1

检查活动是否正在运行或不

if (!isFinishing()) { 
    // Do whatever you want to do 
} 
相关问题