簡體   English   中英

如何從ASyncTask調用父活動功能?

[英]How to call parent activity function from ASyncTask?

可以從Activity調用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

    }

創建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)創建一個界面

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);
  }

}

Advantege使用界面?

這似乎是一個漫長的方法,但如果你使用這種方法

你可以做一個松散耦合的AsyncTask。 這意味着你可以在任何Activity in Future中使用相同的AsyncTask,甚至不用更改AsyncTask中的代碼。

相關鏈接:

為了更好地理解,您可以閱讀此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM