20

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

    }
4

2 回答 2

73

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

AsyncTask myTask = new MyTask(this);

然后从 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();
    }
}
于 2011-04-02T14:10:21.080 回答
3

使用界面

跟着这些步骤:

1) 创建接口

public interface AsyncTaskListener{

   public void updateResult(String result);

}

2)在你的 AsyncTask 中使用监听器

DownloadSongTask extends AsyncTask<String,Integer,String>{

   private AsyncTaskListener listener;

   public DownloadSongTask(Context context)
   {
       listener= (AsyncTaskListener)context;    // Typecast 
   }

   @Override
   public void doInbackGround(String... params)
   {
       // Download code
       int downloadPerc = // calculate that
       publish(downloadPerc);   
   }

   @Override
   public void onPostExecute(String result)
   {
       listener.updateResult(String result);  // Use it 
   }

}

3)在你的Activity中实现接口并重写接口方法

  public class YourActivity extends AppcompatActivity implements AsyncTaskListener{

  // Activity code //
  new  DownloadSongTask(this).execute("Paradise.mp3");  // this is how you start Task

  public void yourMethod(String arg)
  {
    // Your method related Stuff
  }

  @Override 
  public void updateResult(String result){
        yourMethod(result);
  }

}

使用界面的优势?

起初这似乎是一个冗长的方法,但如果你使用这种方法

您可以创建一个松散耦合的 AsyncTask。这意味着您可以在未来的任何活动中使用相同的 AsyncTask,甚至无需更改 AsyncTask 中的代码。

相关链接:

为了更好地理解,您可以阅读此答案

于 2019-01-25T08:10:27.437 回答