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