Как вызвать функцию родительской активности из ASyncTask? - PullRequest
19 голосов
/ 02 апреля 2011

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

    }

Ответы [ 2 ]

70 голосов
/ 02 апреля 2011

Когда вы создаете AsyncTask, вы можете добавить в него новый конструктор и передать ссылку на Activity:

AsyncTask myTask = new MyTask(this);

И затем из метода onPostExecute () в AsyncTask вы можете вызвать метод в 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();
    }
}
2 голосов
/ 25 января 2019

Использовать интерфейс

Выполните следующие действия:

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.

Соответствующие ссылки:

Для лучшего понимания вы можете прочитать это ОТВЕТ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...