2013-05-14 76 views
1

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

什么我需要一旦任务已完成返回到活动并完成()它。麻烦是我似乎无法解决如何等待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(); 

      } 
} 

什么我需要做的主要活动调用完成()一旦完成。感谢您的时间

UPDATE EXCUTE通过

UpdateAsyncTask task = new UpdateAsyncTask(context); 

       task.setCallbackActivity(this); 

       task.execute(); 

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

+0

onPostExecute()在任务完成时发生。它是用这种方式自己设计的处理程序设计的,因此您应该使用它来完成您要完成的任何任务。 –

+0

我可能还没有理解你的问题......你是否试图在任务完成后完成活动? –

+0

是的。主要活动调用AsyncTask,一旦完成,我想在活动 –

回答

3

你可以用一个接口实现回调如下:

接口:

public interface CallbackActivity { 
    public void activityCallback(); 
} 

实现这种活性界面:

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的构造函数中添加一个参数来直接传递回调(少代码)

+0

onPostExecute()在(Main)UI线程上运行,它是使用asynctask的全部要点。为什么要添加回调?这似乎不是多余的? –

+0

好吧,它进步,但现在坐在那里,并没有完成。猜猜它是如何处理它的。请参阅更新 –

+0

您是否在onPostExecute中添加了:“if(this.mCallback!= null){this.mCallback.activityCallback();}”? – Akayh

0

onPostExecute()发生在主线程(您UI),因此如果您的AsyncTask是活动的内部类,或者发送上下文并使用context.finish()完成活动,则可以从onPostExecute()调用finish()。另一种选择是从onPostExecute()打电话给你的活动类运行finish()

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

不允许我在此添加完成()而不添加新方法 –

+0

此类目前是否嵌套在活动类中?这就是我通常会使用asynctask的方式...... –

+0

不,这是一个单独的课程,因为我将要再次使用它来实现不同的活动 –

0

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

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