Android 确定异步任务何时完成

Android 确定异步任务何时完成,android,android-asynctask,Android,Android Asynctask,我有一个从一个活动开始的异步任务。它将一些数据保存到sqlite数据库中,可能需要几秒钟的时间。我在onPreExecute()中设置了一个标准进度条,并在onPostExecute()中取消了它,并在doInBackground中做了一些工作(Void…arg0) 完成任务后,返回活动并完成()所需的内容。问题是我似乎无法解决如何等待任务完成。我可以计算出状态,但这对我没有帮助 public class UpdateAsyncTask extends AsyncTask<Void

我有一个从一个活动开始的异步任务。它将一些数据保存到sqlite数据库中,可能需要几秒钟的时间。我在onPreExecute()中设置了一个标准进度条,并在onPostExecute()中取消了它,并在doInBackground中做了一些工作(Void…arg0)

完成任务后,返回活动并完成()所需的内容。问题是我似乎无法解决如何等待任务完成。我可以计算出状态,但这对我没有帮助

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

          }
}
更新2
aynctask是一个独立的任务,因为我希望在主线程(您的UI)上重复使用它,所以如果您的
异步任务
是活动的内部类,您可以从
onPostExecute()
调用
finish()
,或者发送上下文并使用
context.finish()完成活动
。另一个选项是从
onPostExecute()
调用活动类中运行
finish()
onPostExecute()
的方法,该方法发生在主线程(UI)上,因此如果
AsyncTask
是活动的内部类,则可以从
onPostExecute()
调用
finish(),或者发送上下文并使用
context.finish()
完成活动。另一个选项是从
onPostExecute()
调用活动类中运行
finish()

的方法,类似这样的方法应该可以工作

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

像这样的东西应该有用

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

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

接口:

public interface CallbackActivity {
     public void activityCallback();
}
在活动中实现此接口:

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

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

}
public类UpdateAsyncTask扩展异步任务{
私有回调活动mCallback=null;
@凌驾
受保护的void onPreExecute(){
进度=新建进度对话框(上下文);
progress.setMessage(“加载…”);
progress.show();
}
@凌驾
受保护的布尔doInBackground(无效…arg0){
//工作
返回true;
}
受保护的void onPostExecute(){
进步。解散();
如果(this.mCallback!=null){this.mCallback.activityCallback();}
}
public void setCallbackActivity(CallbackActivity ca){
this.mCallback=ca;
}
}
UpdateAsyncTask与特定活动完全分离,您可以在任何地方使用它(但需要设置回调)。。。如果不需要,那么在活动中使用内部类更容易


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

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

接口:

public interface CallbackActivity {
     public void activityCallback();
}
在活动中实现此接口:

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

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

}
public类UpdateAsyncTask扩展异步任务{
私有回调活动mCallback=null;
@凌驾
受保护的void onPreExecute(){
进度=新建进度对话框(上下文);
progress.setMessage(“加载…”);
progress.show();
}
@凌驾
受保护的布尔doInBackground(无效…arg0){
//工作
返回true;
}
受保护的void onPostExecute(){
进步。解散();
如果(this.mCallback!=null){this.mCallback.activityCallback();}
}
public void setCallbackActivity(CallbackActivity ca){
this.mCallback=ca;
}
}
UpdateAsyncTask与特定活动完全分离,您可以在任何地方使用它(但需要设置回调)。。。如果不需要,那么在活动中使用内部类更容易


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

完成回调是什么意思?你是说调用异步任务的活动? 您可以在异步任务中完成它。 您只需将上下文从活动类传递到AsyncTask

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

什么意思?完成它?你是说调用异步任务的活动? 您可以在异步任务中完成它。 您只需将上下文从活动类传递到AsyncTask

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

onPostExecute()在任务完成时发生。它是用自己的处理器设计的,所以你应该用它来完成你想完成的任何任务。我可能不理解你的问题。。。您是否试图在任务完成后完成活动?是。主活动调用AsyncTask,一旦它完成,我想对该活动调用finish(),正如Aviel所说,只需从onPostExecute()调用finish()。对话框是否被取消?任务完成时会发生onPostExecute()。它是用自己的处理器设计的,所以你应该用它来完成你想完成的任何任务。我可能不理解你的问题。。。您是否试图在任务完成后完成活动?是。主活动调用AsyncTask,一旦它完成,我想在活动上调用finish(),正如Aviel所说的,只需从onPostExecute()调用finish()。对话框是否被取消?onPostExecute()在(主)UI线程上运行,这就是使用AsyncTask的全部意义。为什么要添加回调?这看起来是多余的吗?好吧,它正在进步,但现在只是停留在那里,还没有完成。猜猜我是怎么执行的。请参阅updateHave you add:“如果(this.mCallback!=null){this.mCallback.activityCallback();}”在onPostExecute中?将活动放入并更新异步任务代码。。。我已经测试过了。它适用于在(主)UI线程上运行的meonPostExecute(),这是使用asynctask的全部要点。为什么要添加回调?这看起来是多余的吗?好吧,它正在进步,但现在只是停留在那里,还没有完成。猜猜我是怎么执行的。请参阅updateHave添加:“如果(this.mCallback!=null){this.mCallback.acti