Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从ASyncTask调用父活动函数?_Android_Android Asynctask_Accountmanager - Fatal编程技术网

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

}