Android的AsyncTask的上下文终止 [英] Android AsyncTask Context Terminated

查看:296
本文介绍了Android的AsyncTask的上下文终止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当活动结束,如屏幕方向变化后,是可以改变的的AsyncTask 活动的背景下?否则,因为当活动结束的AsyncTask 的活动范围内消失过它会创建一个错误。

我的功课做的是以下内容:

 公共无效的onSaveInstanceState(包savedInstanceState)<  - 未解决
公共对象onRetainNonConfigurationInstance()<  - 未解决
 

 安卓configChanges =keyboardHidden |定位
                     <  - 解决了,但没有处理好相关布局
 

解决方案

你传递什么是你的 onRetainNonConfigurationInstance()?我做的是一个对象传递给它包含的AsyncTask ,然后我尝试检索的值getLastNonConfigurationInstance()

编辑:关于第二个想法,这将取决于你想要配置更改后的事。如果你想终止的AsyncTask ,然后调用取消()就可以了。如果你想,即使改变方向时继续处理,那么你一定要挺住的任务。

您可以做到这一点通过保存活动的AsyncTask 是这样的:

 私人MyAsyncTask searchTask;

@覆盖
公共无效的onCreate(包savedInstance){
 super.onCreate(savedInstance);

 如果(getLastNonConfigurationInstance()!= NULL){
  SavedObject savedObj =(SavedObject)getLastNonConfigurationInstance();

  sea​​rchTask = savedObj.getAsyncTask();
  sea​​rchTask.attach(本);
 } 其他 {
  sea​​rchTask =新MyAsyncTask(本);
  sea​​rchTask.execute();
 }
}

@覆盖
公共对象onRetainNonConfigurationInstance(){

 sea​​rchTask.detach();

 最后SavedObject savedObj =新SavedObject();
 savedObj.setAsyncTask(searchTask);

    返回savedObj;
}


私有类MyAsyncTask扩展的AsyncTask<虚空,虚空,虚空> {

 MyActivity parentActivity = NULL;

    MyAsyncTask(MyActivity活动){
  附加(活动);
 }

 空连接(MyActivity活动){
  this.parentActivity =活动;
 }

 无效分离(){
  parentActivity = NULL;
 }

 //这里做你的线程处理
}


私有类SavedObject {
 私人MyAsyncTask AsyncTask的;

 公共无效setAsyncTask(MyAsyncTask的AsyncTask){
  this.asyncTask = AsyncTask的;
 }

 公共MyAsyncTask getAsyncTask(){
  返回AsyncTask的;
 }
}
 

When an Activity terminates, e.g. after screen orientation changing, is that possible to change an AsyncTask activity context? Else it will create an error because when the activity terminates AsyncTask's activity context is gone too.

My homework done is the following:

public void onSaveInstanceState(Bundle savedInstanceState) <- doesn't solve
public Object onRetainNonConfigurationInstance()  <- doesn't solve

android:configChanges="keyboardHidden|orientation" 
                     <- solved but doesn't handle well relative layouts

解决方案

What do you pass on your onRetainNonConfigurationInstance()? What I do is pass an object to it containing the AsyncTask, and then I try to retrieve the value in getLastNonConfigurationInstance().

EDIT: On second thought, it would depend on what you want to do after a configuration change. If you want to terminate the AsyncTask, and then call cancel() on it. If you want to continue its processing even after an orientation change, then you have to hold on to the task.

You can do that by saving the Activity in the AsyncTask like this:

private MyAsyncTask searchTask;

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

 if (getLastNonConfigurationInstance()!=null) {
  SavedObject savedObj = (SavedObject)getLastNonConfigurationInstance();

  searchTask = savedObj.getAsyncTask();
  searchTask.attach(this);
 } else {
  searchTask = new MyAsyncTask(this);
  searchTask.execute();
 }
}

@Override
public Object onRetainNonConfigurationInstance(){

 searchTask.detach();

 final SavedObject savedObj = new SavedObject();
 savedObj.setAsyncTask(searchTask);

    return savedObj;
}


private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

 MyActivity parentActivity = null;

    MyAsyncTask (MyActivity activity) {
  attach(activity);   
 }

 void attach(MyActivity activity) {
  this.parentActivity=activity;
 }

 void detach() {
  parentActivity=null;
 }

 // Do your thread processing here
}


private class SavedObject {
 private MyAsyncTask asyncTask;

 public void setAsyncTask(MyAsyncTask asyncTask){
  this.asyncTask = asyncTask;
 }

 public MyAsyncTask getAsyncTask() {
  return asyncTask;
 }
}

这篇关于Android的AsyncTask的上下文终止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆