如何从另一个活动刷新异步任务?

时间:2011-08-14 14:57:24

标签: android android-asynctask

我正在启动一项活动,一旦用户登录,我想刷新主要活动。从登录用户加载数据。

如图像和名称。我已经完成了所有这些工作。

我只需要知道是否可以再次启动另一个活动并运行其异步任务。从另一个活动中启动一个意图?

3 个答案:

答案 0 :(得分:2)

目前尚不清楚您的设计究竟是什么,但如果您需要从两个不同的活动中使用相同的AsyncTask,它应该是一个单独的类,不依赖于特定的活动。您可以让这两个活动实现一个公共接口,以便AsyncTask不需要知道它正在更新哪个活动。然后通过将引用传递给封闭活动来实例化任务,并根据需要启动它。一个活动不需要启动另一个活动。

类似的东西:

public interface UserActivity {
  void updateUserData(UserData userData);
}

public class Activity1 implements UserActivity {

   public void onStart() {
      UpdateUserDataTask task = new UpdateUserDataTask(this);
      task.execute();
   }

   public void updateUserData(UserData userData) {
      // update
   }
}

public class UpdateUserDataTask extends AsyncTask<Void, Void, UserData> {
    UserActivity userActivity;

    public UpdateUserDataTask(UserActivitiy userActivity) {
       this.userActivity = userActivity;
    }

    // doInBackground, etc implementation.

    protected void onPostExecute(UserData userData) {
       userActivity.updateUserData(userData);
    }
}

答案 1 :(得分:0)

据我所知,AsyncTasks不应该被重用。它们应该运行一次,然后你可以根据需要创建一个新的。

答案 2 :(得分:0)

执行一次AsyncTask后,您无法再次执行它。但是,您可以使用onProgressUpdate()publishProgress()控制它“刷新”,如下所示。请注意,这仅适用于一次性刷新。如果您希望在语义上更正确,可以在onProgressUpdate()中执行“正常”操作,并使用onPostExecute()进行重新刷新。

public class MyAsyncTask extends AsyncTask<Void, String, Void> {

    private boolean isRefresh = false;
    @Override
    protected Void doInBackground(Void... arg0) {
        while (!isRefresh){
            //Perform your normal operation
        }

    //When isRefresh is true, you want to refresh.  
        this.publishProgress(values);
        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        // Refresh code here
        super.onProgressUpdate(values);
    }

    public void refreshTask(){
        this.isRefresh = true;
    }

}

然后,您可以维护对MyAsyncTask对象的引用,并在您想要刷新它时调用refreshTask()