Android会在每次配置更改时启动异步任务

时间:2011-12-06 15:20:56

标签: android configuration android-asynctask

在阅读了一些关于Android配置的文章之后,当我将视图从纵向更改为横向时,我仍然不知道如何不启动异步任务。我从服务器加载一些信息,每次旋转手机都加载它是不明智的。我想加载一次。如果不在Manifest文件中添加'changeConfig'标志,我可以这样做吗?

3 个答案:

答案 0 :(得分:3)

1使AsyncTask成为类的私有实例变量(必须声明为静态内部类或单独文件)。

2在onRetainConfigurationChanges()

中返回您的AsyncTask实例
  public Object onRetainNonConfigurationInstance() {
      return yourAsyncTask;
  }

3在oResume()中找回它:

 public void onResume() {
   Object data = getLastNonConfigurationInstance();
   if (data != null) {
     ... // pass in your activity to the AsyncTask so it can update your views
   } else {
     ... // create new AsyncTask and spin it up.
   }
 }

答案 1 :(得分:1)

您需要查看此http://developer.android.com/resources/articles/faster-screen-orientation-change.html

这将解决你提到的所有问题

基本上你需要实现

public Object onRetainNonConfigurationInstance()

返回您想要的数据

然后你需要调用getLastNonConfigurationInstance,如果值在那里,不要从服务器获取它: - )

答案 2 :(得分:0)

不要盲目启动asyncTask。请遵循以下说明:

  1. 在您的活动变量声明中定义'boolean guard = false'
  2. 在“onCreate(...)do:

    里面
    if(savedInstanceState!=null){
        guard=(Boolean) savedInstanceState.get(guardkey) //guardkey is the bundle key. (*1)
    } else{
        guard=false;
    }
    if(!guard){
        //launch your asyncTask
        guard=true;
        //other operations if needed
    }
    

    现在,添加到“onSaveInstanceState(outState)”方法(如果你没有它,现在就这样做)以下一行:

    outState.put(guardkey, guard); //(*1)
    
  3. 注意:这会阻止您在每次更改配置时触发任务。它假设您已经从服务器收到了您的信息,并且您已将其保存在您的活动中(这意味着您可以在重新启动活动时检索它)。否则,此解决方案不适合您。