【问题标题】:AsyncTask run 5 times and then not run doInBackground methodAsyncTask 运行 5 次然后不运行 doInBackground 方法
【发布时间】:2012-06-18 05:48:39
【问题描述】:

点击按钮调用该方法:

private void goRegister(final boolean isUsername) {
    new Loading.LoadTast(ctx) {

        @Override
        protected String doInBackground(Integer... params) {
            Looper.prepare();
            String msg=doRegister(isUsername);
            closeProgressDialog();
            if(msg == null || msg.length() == 0) {
                SmartNgApplication.getInstance().exit();
            } else {
                BaseHelper.showToast(ctx, msg);
            }
            Looper.loop();
            return null;
        }

    }.execute();
}

这是 LoadTast 类:

public abstract static class LoadTast extends AsyncTask <Integer, Integer, String > {

    private ProgressDialog progressDialog;

    private Context ctx;

    public LoadTast(Context ctx) {
        this.ctx=ctx;
    }

    protected abstract String doInBackground(Integer... params);

    public void onPreExecute() {
        super.onPreExecute();
        progressDialog=ProgressDialog.show(ctx, "", "loading...", true, false);
    }

    public void onPostExecute(String result) {
        super.onPostExecute(result);
        progressDialog.dismiss();
        BaseHelper.showToast(ctx, result);
    }

    public void closeProgressDialog() {
        if(progressDialog != null) {
            progressDialog.dismiss();
        }
    }
}

我的程序是: 当我点击 5 次按钮时,不要调用 doInbackground 方法并且屏幕总是运行加载。我猜代码是运行onPreExecute 而不是运行doInbackground。为什么?? 在AsyncTask 中有一个线程池,CORE_POOL_SIZE=5。程序怎么解决,帮帮我,谢谢!

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    asyncTask 不应该多次运行它的 doInBackground ,也不应该是一个循环线程。

    asyncTask 应该是你一次性运行的事情,你只能假设如果执行了多个 asyncTask,至少会有一个同时运行。

    我注意到的另一件事:您在 doInBackground 中调用了 closeProgressDialog,但这是与 UI 相关的操作,而 doInBackground 正在非 UI 线程上运行。

    【讨论】:

    • 我删除了 doInBackground 中的 closeProgressDialog 代码运行良好
    • 我不明白。它解决了你的问题吗?如果是,请勾选这个答案。如果没有,请告诉我们什么是状态。正如我所写的,asyncTask 不应该被多次执行。如果您希望多次执行同一任务,则必须创建该任务的多个实例。
    【解决方案2】:

    我自己也遇到过这个问题。我通过在thread pool 中执行AsyncTasks 而不是serial 来解决它。

    为此,您必须像这样调用您的 AsyncTask:

    YourAsyncTask task = new YourAsyncTask();
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    

    这应该可以解决您遇到的问题。

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多