我确实在活动中使用了很多 AsyncTasks 作为私有内部类。从一开始就让我困惑的一件事是我在 onPostExecute() 中得到了什么上下文?
如果您查看下面显示的精简示例,您可以在 onPostExecute() 中使用 getString()。该调用使用什么上下文?Activity 可能在 doInBackground 期间发生了变化(例如 OrientationChange),因此它不可能是那个上下文。
目前我修补活动上下文(task.context = this)并使用该特定上下文(context.getString())。
我的问题:在内部类 AsyncTask 的 onPostExecute() 中使用 getString() 而不使用周围 Activity 的上下文是否可以节省?
提前谢谢了。
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;
}
}