我已经通过 CommonsWare 实现了 Asynctask+orientation 更改方法。
基本上,它的作用是当设备旋转时,活动被破坏。因此,在活动销毁的最后阶段,它将 AsyncTask 从活动中分离出来,并将其传递给新活动。创建新活动时,我将 AsyncTask 附加回新活动。
注意:我没有使用android:configChanges="orientation
in manifest,因为我需要不同的纵向和横向布局。
一切正常。
众所周知,有一种显示对话框的正确方法,我正在使用它。
这也很好用。
当我尝试同时使用这两种方法时,就会出现问题。
当我用showDialog(n)
. 如果我旋转设备一次,一切正常。但是,当我在 logcat 日志之后再次旋转时E/WindowManager(10035): ActivityMainActivity has leaked window DecorView@40520998 that was originally added here
,应用程序并没有崩溃。之后,每次我旋转设备时,logcat 都会开始记录相同的错误,但不会崩溃。
代码(主要活动):
public class MainActivity extends BaseActivity {
private static final int RATE_US = 1;
private MainPageAsync task = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
showDialog(RATE_US);
task = (MainPageAsync) getLastNonConfigurationInstance();
if (task == null) {
task = new MainPageAsync(this);
task.execute(super.currentPage);
} else {
task.attach(this);
}
}
@Override
public Object onRetainNonConfigurationInstance() {
// remove activity from asynctask
if (task != null)
task.detach();
return task;
}
@Override
protected Dialog onCreateDialog(int id) {
if (id == RATE_US) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("test")
.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
//dosomethinghere
}
});
return builder.create();
} else {
return super.onCreateDialog(id);
}
}
}
代码(异步任务):
public class MainPageAsync extends AsyncTask<String, String, Document> {
private MainActivity a;
public MainPageAsync(MainActivity activity) {
this.a = activity;
}
public void detach() {
a = null;
}
public void attach(MainActivity activity) {
this.a = activity;
}
@Override
protected Document doInBackground(String... params) {
//network work
}
@Override
protected void onPostExecute(final Document doc) {
//more work on UI thread
}
}