2

我确实在活动中使用了很多 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;
    }
}
4

2 回答 2

1

MyAsyncTask()您正在使用以下this指针初始化您的实例:

task = new MyAsyncTask(this);

onPostExecute您访问context使用提供的指针初始化的类成员时。您的上下文是封闭类的上下文,即MyActivity.

于 2012-05-18T10:07:07.527 回答
1

在内部类 AsyncTask 的 onPostExecute() 中使用 getString() 而不使用周围 Activity 的上下文是否可以节省?

不,这不安全。作为该活动中的内部类,您的MyAsyncTask类在创建时将有参考MyActivity。因此,如果MyActivity因任何原因(如轮换)被杀死,在onPostExecute回调中您最终将MyAsyncTask持有被杀死MyActivity实例的引用。

使用对 . 的引用Activity更安全,因为您更新该引用以始终指向MyActivity. 也许您还想Activity直接使 in onRetainNonConfigurationInstancewith无效,null 以确保您不触摸它(如果MyAsyncTask到达,onPostExecute直到您MyActivity再次设置),直到您有一个有效的参考。

于 2012-05-18T10:19:19.197 回答