Android 如何从ASyncTask调用父活动函数?
Android 如何从ASyncTask调用父活动函数?,android,android-asynctask,accountmanager,Android,Android Asynctask,Accountmanager,setAccountAuthenticatorResult可以从活动调用,该活动扩展了AccountAuthenticatorActivity。我的活动扩展了它,但启动了ASyncTask,因此应该从ASyncTask调用此setAccountAuthenticatorResult(或者,ASyncTask的结果应该传递回主线程) 怎么做 下面的代码有什么问题 AsyncTask<Uri, Void, Bundle> task = new RetrieveAccessTokenTas
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 task=newretrieveaccesstokentask(this、consumer、provider、prefs);
公共类RetrieveAccessTokenTask扩展了AsyncTask{
私人语境;
公共检索AccessTokenTask(上下文上下文、OAuthConsumer使用者、,
OAuthProvider提供程序,SharedReferences首选项){
this.context=上下文;
}
@凌驾
受保护的void onPostExecute(捆绑结果){
context.setAccountAuthenticatorResult();//不起作用
}
创建AsyncTask时,可以向其添加新构造函数,并传入对活动的引用:
AsyncTask myTask = new MyTask(this);
然后从AsyncTask中的onPostExecute()方法可以调用活动中的方法
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();
}
}
公共类MyTask扩展了AsyncTask
{
公共活动;
公共MyTask(MyActivity a)
{
本活动=a;
}
// ......
受保护的void onPostExecute(字符串结果)
{
activity.myMethod();
}
}
使用界面
遵循以下步骤:
1)创建一个接口
public interface AsyncTaskListener{
public void updateResult(String result);
}
2)在异步任务中使用侦听器
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
}
}
使用界面的优点?
起初这似乎是一个冗长的方法,但如果你使用这种方法
您可以创建一个松散耦合的AsyncTask。这意味着您可以在将来的任何活动中使用相同的AsyncTask,而无需更改AsyncTask中的代码
相关链接:
为了更好地理解,您可以阅读此我实现了以下内容:AsyncTask返回所需的Bundle,我通过task.get()获取其值从主线程。这是正确的方法吗?嗨,如果可能的话,请检查我在奥利的帖子下的评论。你觉得怎么样?干杯,谢谢@Ollie C。我已经在评论中添加了我的方法。它会和你的方法一样工作吗?哪种方法更好?我更喜欢传递活动参考,而不是相反的方式,因为它会使你更专注对我来说是感性的,如果我调用任务来获取信息,我如何知道任务处于正确的状态?顺便说一句,第三个选项可能更适合某些场景(例如,如果需要更新小部件和活动)将广播一个意图,并使用广播接收器接受消息。@Ollie C,按照您的方法,我已经用代码更新了我的问题-它不起作用。这里出了什么问题?在您的活动中,当前活动引用了它。因此,在创建它时将其传递给AsyncTask。如果调用了activity类d MyActivityClass(即MyActivityClass扩展活动),则构造函数上的参数类型需要为MyActivityClass,异步任务中的活动变量类型也需要类似于MyActivityClass。您应该只使用活动的弱引用,以便可以对其进行垃圾收集。
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);
}
}