[英]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);
}
}
這似乎是一個漫長的方法,但如果你使用這種方法
你可以做一個松散耦合的AsyncTask。 這意味着你可以在任何Activity in Future中使用相同的AsyncTask,甚至不用更改AsyncTask中的代碼。
為了更好地理解,您可以閱讀此答案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.