如何从ASyncTask调用父活动功能?

LA_*_*LA_ 19 android accountmanager android-asynctask

setAccountAuthenticatorResult可以从Activity中调用,它可以扩展AccountAuthenticatorActivity.我的活动扩展了,但是启动了ASyncTask,因此setAccountAuthenticatorResult应该从ASyncTask调用(或者,ASyncTask的结果应该传递回主线程).

怎么做?

下面的代码有什么问题?

AsyncTask<Uri, Void, Bundle> task = new RetrieveAccessTokenTask(this, consumer, provider, prefs).execute(uri);

public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Bundle> {
    private Context context;

    public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,
            OAuthProvider provider, SharedPreferences prefs) {
        this.context = context;
    }

    @Override
    protected void onPostExecute(Bundle result) {
        context.setAccountAuthenticatorResult(); // doesn't work

    }
Run Code Online (Sandbox Code Playgroud)

Oll*_*e C 71

创建AsyncTask时,可以向其添加新的构造函数,并传入对Activity的引用:

AsyncTask myTask = new MyTask(this);
Run Code Online (Sandbox Code Playgroud)

然后从AsyncTask中的onPostExecute()方法中可以调用Activity上的方法.

public class MyTask extends AsyncTask<String, String, String>
{
    public MyActivity activity;

    public MyTask(MyActivity a)
    {
        this.activity = a;
    }

    //  ......

    protected void onPostExecute(String result)
    {
        activity.myMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你应该只使用对活动的弱引用,以便它可以被垃圾收集. (4认同)
  • 在您的活动中,使用此参考当前活动.因此,在创建它时将其传递给AsyncTask.如果Activity类被调用MyActivityClass(即MyActivityClass扩展Activity),那么构造函数上的param类型需要是MyActivityClass,而AsyncTask中活动var的类型也需要像MyActivityClass. (2认同)