我有一个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是一个单独的任务,因为我想重新使用它
答案 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();
}