我试图知道如何使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]));
}
}
}
答案 0 :(得分:0)
AsyncTask
在方向更改时从UI线程创建单独的线程,它会自行重新创建,但AsyncTask
仍然在运行,因为它将背景线程分开。
在完成一些重要的工作时,您可以锁定屏幕方向一段时间,直到AsyncTask
完成然后解锁。
<强>锁定强>
protected void onPreExecute() {
// ....
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}
<强>解锁:强>
protected void onPostExecute(String result) {
// ...
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}