AsyncTask在没有无头片段的情况下幸存了screenOrientation

时间:2016-07-21 10:40:22

标签: android android-asynctask headless-fragments

我试图知道如何使AsyncTask在screenOrientation更改中幸存。因此,我使用AsyncTask为MainActivity创建了一个示例。如下面的代码所示 doInBackground()方法我每秒打印变量“i”的递增值,最多7秒,然后使用publishProgress()发布变量“i”的值 并在TextView中显示它。虽然varibale“i”的值正在发布,但我改变了设备的方向,我预计应用程序会崩溃,但发生的事情是, screenOrientation已更改,变量“i”的值正在发布,并且通常会在TextView中显示而不会崩溃。

我创建的AsyncTask不是一个合适的例子来学习如何在screenOrientation中生存吗?

MainActivity

public class MainActivity extends AppCompatActivity {

private final static String TAG = MainActivity.class.getSimpleName();

private TextView mtv11Up = null;

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

    this.mtv11Up = (TextView) findViewById(R.id.tv11_up);
    new ATRetain().execute();
}

private class ATRetain extends AsyncTask<Void, Integer, Void> {

    private long mStartTime;
    private int i = 0;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        this.mStartTime = TimeUtils.getTSSec();
    }

    @Override
    protected Void doInBackground(Void... params) {

        Log.i(TAG, "started");

        while((TimeUtils.getTSSec() - this.mStartTime) <= 7) {
            Log.i(TAG, "i: " + (++i));
            publishProgress(i);
            SystemClock.sleep(1000);
        }

        Log.i(TAG, "finished");
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

        mtv11Up.setText(String.valueOf(values[0]));
    }
}
}

1 个答案:

答案 0 :(得分:0)

AsyncTask在方向更改时从UI线程创建单独的线程,它会自行重新创建,但AsyncTask仍然在运行,因为它将背景线程分开。

在完成一些重要的工作时,您可以锁定屏幕方向一段时间,直到AsyncTask完成然后解锁。

<强>锁定

 protected void onPreExecute() {
    // ....
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
   }

<强>解锁:

protected void onPostExecute(String result) {
     // ...
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
   }