CommonsWareによるAsynctask+orientationchangeメソッドを実装しました。
基本的に、それが行うことは、デバイスが回転すると、アクティビティが破棄されるということです。したがって、アクティビティの破棄の最終段階で、AsyncTaskをアクティビティから切り離し、新しいアクティビティに渡します。新しいアクティビティが作成されたら、AsyncTaskを新しいアクティビティにアタッチし直します。
android:configChanges="orientation
注:縦向きと横向きで異なるレイアウトが必要だったため、inマニフェストは使用しませんでした。
すべてが正常に動作します。
ご存知のように、ダイアログを表示する正しい方法があり、私はそれを使用しています。
これも問題なく動作します。
これらの両方の方法を一緒に使用しようとすると、問題が発生します。
で呼び出すと、ダイアログが表示されますshowDialog(n)
。デバイスを1回回転させると、すべて問題ありません。しかし、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);
}
}
}
コード(AsyncTask):
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
}
}