我已将AsyncTasks
用于我的应用程序,以便延迟下载和更新用户界面。
现在我的AsyncTasks
简单地更新了用户界面:
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
gender.setText(values[0]);
}
我的问题是如何检查性别TextView
所呈现的活动是否仍然可用?
如果没有,我将收到错误,我的申请将关闭。
答案 0 :(得分:25)
您可以在活动的onDestroy
中取消您的asynctask@Override
protected void onDestroy() {
asynctask.cancel(true);
super.onDestroy();
}
并且在执行更改时,检查您的asynctask是否已被取消(活动被销毁)
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
if(!isCancelled()) {
gender.setText(values[0]);
}
}
答案 1 :(得分:7)
我遇到了类似的问题 - 基本上我是在用户销毁片段后在异步任务中获得NPE。在研究Stack Overflow上的问题之后,我采用了以下解决方案:
volatile boolean running;
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
running=true;
...
}
public void onDestroy() {
super.onDestroy();
running=false;
...
}
然后,我在异步代码中定期检查“是否正在运行”。我有压力测试这个,我现在无法“打破”我的活动。这非常有效,并且比我在SO上看到的一些解决方案更简单。
答案 2 :(得分:3)
尝试
if (!isFinishing()) {
gender.setText(values[0]);
}
答案 3 :(得分:1)
尽管如此,我从未遇到过这种情况;我会尽力回答你的问题。
在您的情况下,您需要验证传递给Context
的{{1}}。
您可以执行验证
AsyncTask
优点是,如果活动在您到达此声明时被销毁,您的if(null!=mContext) //Activity still exist!!
{
gender.setText(values[0]);
}
else //Activity is destroyed
{
//Take appropriate action!!
}
将自动变为Context
,您可以处理该情景。
答案 4 :(得分:1)
我会坚持认为,如果您的Activity没有运行,为什么不取消AsyncTask? 那将是一个更好,更可行的解决方案。如果您正在运行应用程序,则说您从一个Activity移动到另一个Activity,那么它将不会给出错误AFAIK。
但是,我会坚持取消AsyncTask然后你的Activity没有运行,你可以检查AsyncTask是否正在运行,
if(task != null && task.equals(AsyncTask.Status.RUNNING))
task.cancel(true);
答案 5 :(得分:1)
作为 Android开发者的一项培训的this部分建议,在任务完成后需要更新的UI元素上保留WeakReference
并检查参考在使用之前是null
。这不仅有助于检查UI是否仍然存在,而且还不会阻止UI元素被垃圾回收。
答案 6 :(得分:1)
检查活动是否正在运行
if (!isFinishing()) {
// Do whatever you want to do
}
答案 7 :(得分:0)
不应该
if (gender) {
gender.setText(values[0]);
}
够了吗?