私はアクティビティ内でプライベート内部クラスとして多くのAsyncTasksを使用します。最初から私を困惑させているのは、onPostExecute()内でどのようなコンテキストを取得するかということです。
以下に示す簡略化された例を見ると、onPostExecute()内でgetString()を使用できます。その呼び出しにはどのコンテキストが使用されますか?アクティビティはdoInBackground(OrientationChangeなど)中に変更された可能性があるため、そのコンテキストにすることはできません。
現在、アクティビティコンテキスト(task.context = this)にパッチを適用し、その特定のコンテキスト(context.getString())を使用しています。
私の質問:周囲のアクティビティのコンテキストを使用せずに、内部クラスAsyncTaskのonPostExecute()内でgetString()を使用することは保存されますか?
よろしくお願いします。
public class MyActivity extends Activity {
/* package */ MyActivity context;
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
public MyAsyncTask(final MyActivity context) {
super();
this.context = context;
}
@Override
protected Cursor doInBackground(/* ... */) {
// ...
}
@Override
protected void onPostExecute(/* ... */) {
if (context != null) {
// Currently I do use that
String s = context.getString(R.string.mytext);
context.task = null;
}
// Would this be save?
String s2 = getString(R.string.mytext);
}
@Override
protected void onPreExecute (/* ... */) {
// ...
}
}
/* package */ MyAsyncTask task;
@Override
public void onCreate(final Bundle bundle) {
// ...
Bundle bundleExtras = getIntent().getExtras();
if (bundleExtras != null) {
task = (MyAsyncTask) getLastNonConfigurationInstance();
if (task != null) {
task.context = this;
// ...
} else {
task = new MyAsyncTask(this);
task.execute();
}
}
}
@Override
public Object onRetainNonConfigurationInstance() {
if (task != null) {
// ...
task.context = null;
}
return task;
}
}