如果屏幕旋转,则异步任务停止

时间:2013-12-04 17:38:11

标签: android android-asynctask

我已经阅读了很多关于此的问题,但无法找到正确的解决方案...问题是我创建了一个虚拟AsyncTask,当它运行时,我旋转屏幕,AsyncTask突然停止

所以我无法保存其状态,以便当屏幕旋转时,它仅从该状态恢复

我无法使用此解决方案,因为我没有使用片段: - http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

另外,我不希望任何解决方案说在Async运行时锁定你的屏幕方向

   public class MainActivity extends Activity{
      //Some Code
      ProgressDialog progressDialog; // Global Variable
      //OnCreateMethod Here
      //.......
       @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        DummyTask dt = new DummyTask();
        dt.execute();
      }
      private class DummyTask extends AsyncTask<Void, Integer, Void> {

    @Override
    protected void onPreExecute() {
      progressDialog = new ProgressDialog(context);
            progressDialog.setTitle("Processing...");
            progressDialog.setMessage("Please wait.");
            progressDialog.setCancelable(false);
            progressDialog.setIndeterminate(true);
            progressDialog.show();
    }


    @Override
    protected Void doInBackground(Void... ignore) {
      try{
          Thread.sleep(3000);
      }
      catch(Exception e){}
      return null;
    }

    @Override
    protected void onPostExecute(Void ignore) {
      if (progressDialog!=null) {
    pd.dismiss();


     }
        Toast.makeText(getApplicationContext(),"Running",Toast.LENGTH_SHORT).show();
     }
}

2 个答案:

答案 0 :(得分:1)

有几种方法可以使用AsyncTask和配置更改。我会说你基本上有两种选择:

  1. 当检测到配置更改时(即,您的Activity经历了销毁生命周期事件),您取消AsyncTask并在创建新Activity时重新启动它们
  2. 您可以使用保留配置分离和附加
  3. 请参阅#2的CommonsWare示例:https://github.com/commonsguy/cw-android/blob/master/Rotation/RotationAsync/src/com/commonsware/android/rotation/async/RotationAsync.java

答案 1 :(得分:0)

根据您的要求,使用Service可以是更好的实施方式:

public class DownloaderService extends Service {

    private LongRunningAsyncTask task = null;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // Start task
        task = new LongRunningAsyncTask();
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

    }

}

您可以从Service开始Activity

Intent intent = new Intent(this, DownloaderService.class);    
startService(intent);

您甚至可以多次调用startService,它将始终转到相同的DownloaderService实例。因此,如果一个人已经在运行,请确保您不启动AsyncTask。与任何Activity进行通信的一种方法是使用广播。

此外,即使您没有使用Service,也要确保了解不同的Android版本执行AsyncTask的方式。请阅读: