20

setAccountAuthenticatorResultを拡張するアクティビティから呼び出すことができますAccountAuthenticatorActivity。私のアクティビティはそれを拡張しますが、ASyncTaskを起動するため、これsetAccountAuthenticatorResultはASyncTaskから呼び出す必要があります(または、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

    }
4

2 に答える 2

73

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();
    }
}
于 2011-04-02T14:10:21.080 に答える
3

インターフェイスを使用

次の手順を実行します:

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 のコードを変更することなく、将来の任意のアクティビティで同じ AsyncTask を使用できます。

関連リンク:

理解を深めるために、この回答を読むことができます

于 2019-01-25T08:10:27.437 に答える