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

时间:2011-04-02 13:28:15

标签: android android-asynctask accountmanager

可以从活动中调用

setAccountAuthenticatorResult,扩展AccountAuthenticatorActivity。我的活动扩展了,但是启动了ASyncTask,因此应该从ASyncTask调用此setAccountAuthenticatorResult(或者,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

    }

2 个答案:

答案 0 :(得分:69)

创建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();
    }
}

答案 1 :(得分:2)

使用界面

请按照以下步骤操作:

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)在“活动”中实现界面并覆盖界面方法

  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与任何Activity结合使用,而无需更改AsyncTask中的代码。

相关链接:

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