1

我有一个从一个 Activity 启动的 AsyncTask。它将一些数据保存到 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()。谢谢你的时间

更新执行任务

UpdateAsyncTask task = new UpdateAsyncTask(context);

                task.setCallbackActivity(this);

                task.execute();

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

4

4 回答 4

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

于 2013-05-14T22:29:15.390 回答
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();
于 2013-05-14T22:25:02.427 回答
0

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

private Context context;
protected Boolean doInBackground(Context c) {
      context=c;
     return true;
}
protected void onPostExecute() {
         progress.dismiss();
    ((Activity)context).finish();
}
于 2013-05-15T01:16:01.457 回答
0

onPostExecute()发生在主线程(您的 UI)上,因此如果您是活动的内部类,您可以调用finish(),或者发送上下文并使用. 另一种选择是调用Activity 类中运行的方法onPostExecute()AsyncTaskcontext.finish()onPostExecute()finish()

于 2013-05-14T22:08:20.130 回答