【问题标题】:AsyncTask is restarting when i press back button当我按下返回按钮时,AsyncTask 正在重新启动
【发布时间】:2013-11-28 14:43:12
【问题描述】:

我有一个包含多个 AsyncTask 的 Activity,但是当我按下返回按钮时,Activity 会重新加载,并且 AsyncTask 会再次执行。我应该怎么做才能回到上一个活动而不重新加载活动和异步任务?请帮忙。

public class LugarActivity extends SherlockActivity {

CargarDatos cargarDatos;
CargarComentarios cargarComentarios;

@Override
protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_lugar); 

         cargarDatos = new CargarDatos();
         cargarCometarios = new CargarComentarios();

         loadData();
}

public void loadData(){
     cargarDatos.execute();

}

public void loadOtherData(){
     cargarComentarios.execute();
}


public class CargarDatos extends AsyncTask<Integer, Integer, String>{
    @Override
    protected String doInBackground(Integer... params) {
                // here download data
            }

            @Override
            protected void onPostExecute(String html) {         
             loadOtherData();           
            }

}


public class CargarComentarios extends AsyncTask<Integer, Integer, String>{
    @Override
    protected String doInBackground(Integer... params) {
                // here download data
            }

}



}

已修复!

我修复了 Singleton 类的问题:

public class DataManager {

 private static DataManager instance = null;
 protected static boolean isShowingTheView = false;

 protected DataManager() {       }

 public static synchronized DataManager getInstance() {
         if (instance == null) {
                 instance = new DataManager();
         }
         return instance;
 }

}

在活动中我添加了这段代码:

DataManager dataManager = new DataManager();
if(!dataManager.isShowingTheView){
        loadData();
        dataManager.isShowingTheView = true;

    }else{
        finish();
    }

最后我重写了 onDestroy() 方法

@Override
public void onDestroy(){
    dataManager.isShowingTheView = false;
    super.onDestroy();
}

【问题讨论】:

  • 遇到了同样的问题,我添加了一个 if 来验证是否需要启动 loadData

标签: java android android-activity android-asynctask


【解决方案1】:

onCreate 中删除loadData() 并调用其他地方。

【讨论】:

    【解决方案2】:

    使用片段

    http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

    片段可以在配置更改期间保留在内存中,因此您可以在其内部运行异步任务。然后,您可以从片段中查询您需要从任务中获取的任何状态信息,并相应地更新您的 Activity。

    【讨论】:

      【解决方案3】:

      如果您的Activity 在其他活动开始之前被销毁,使用后退按钮将再次调用onCreate,而不是onRestartonResume

      详情请参阅here

      正如 Kuffs 已经提到的那样,使用 Fragments 是可行的方法。

      更丑的解决方案,您还可以在您的AsyncTask 启动后(或在其onPostExecute 上)设置一个持有boolean 的共享首选项,这样它就不会在您的@987654330 上检查该首选项后再次启动@的onCreate

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        相关资源
        最近更新 更多