确定AsyncTask何时完成

时间:2013-05-14 22:01:59

标签: android android-asynctask

我有一个AsyncTask,我从一个Activity开始。它将一些数据保存到sqlite数据库,可能需要几秒钟的时间。我在onPreExecute()中设置了一个标准的进度条,并在onPostExecute()中解除它并在doInBackground(Void ... arg0)中做了一些工作。

完成任务后我需要返回活动并完成()它。麻烦的是我似乎无法弄清楚如何等待AsyncTask完成。我可以解决这个问题,但这对我没有帮助。

    public class UpdateAsyncTask extends AsyncTask<Void, Void, Boolean> {

    @Override
    protected void onPreExecute() {
            progress = new ProgressDialog(context);
            progress.setMessage("Loading ...");
            progress.show();
    }

    @Override
    protected Boolean doInBackground(Void... arg0) {
          // Do work
         return true;

    }

    protected void onPostExecute() {
             progress.dismiss();

          }
}

完成后,我需要对主活动调用finish()做什么。谢谢你的时间

UPDATE

执行任务
UpdateAsyncTask task = new UpdateAsyncTask(context);

                task.setCallbackActivity(this);

                task.execute();

更新2 aynctask是一个单独的任务,因为我想重新使用它

4 个答案:

答案 0 :(得分:3)

您可以使用以下接口实现回调:

界面:

public interface CallbackActivity {
     public void activityCallback();
}

在activity中实现此接口:

public class myActivity extends Activity implements CallbackActivity{ 
      @Override
      public void activityCallback(){
         finish();
      }
}

您的updateAsyncTask:

public class UpdateAsyncTask extends AsyncTask<Void, Void, Boolean> {
      private CallbackActivity mCallback = null;
      @Override
      protected void onPreExecute() {
           progress = new ProgressDialog(context);
           progress.setMessage("Loading ...");
           progress.show();
      }

      @Override
      protected Boolean doInBackground(Void... arg0) {
        // Do work
           return true;

      }

      protected void onPostExecute() {
         progress.dismiss();
         if(this.mCallback != null) { this.mCallback.activityCallback(); }
      }

      public void setCallbackActivity(CallbackActivity ca) {
         this.mCallback = ca;
      }

}

你的UpdateAsyncTask完全脱离了特定的活动,你可以随意在任何地方使用它(但你需要设置回调)......如果不需要,在活动中使用内部类更容易

编辑:你可以在AsyncTask构造函数中添加一个参数来直接传递回调(代码少)

答案 1 :(得分:1)

这样的事情应该有用......

public class UpdateAsyncTask extends AsyncTask<Void, Void, Boolean> {

    protected void onPreExecute() {
            ProgressDialog(context) progress = new ProgressDialog(context);
            progress.setMessage("Loading ...");
            progress.show();
    }

    protected Boolean doInBackground(Void... arg0) {
          // Do work
         return true;
    }

    protected void onPostExecute(Boolean result) {
        progress.dismiss();
        finish();
    }
}

这应该嵌套在您的活动类中并执行如下:

new UpdateAsyncTask().execute();

答案 2 :(得分:0)

onPostExecute()发生在主线程(您的用户界面)上,因此如果您的finish()是活动的内部类,则可以从onPostExecute()致电AsyncTask,或发送上下文并使用context.finish()完成活动。另一个选项是从onPostExecute()调用运行finish()

的活动类中的方法

答案 3 :(得分:0)

你是什么意思完成它?你的意思是调用AsyncTask的活动? 你可以在你的AsyncTask中完成它。 您所需要的只是将上下文从您的活动类传递给AsyncTask。

private Context context;
protected Boolean doInBackground(Context c) {
      context=c;
     return true;
}
protected void onPostExecute() {
         progress.dismiss();
    ((Activity)context).finish();
}