0

单击按钮调用此方法:

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方法并且屏幕总是运行加载。我猜代码是 runonPreExecute而不是 run doInbackground。为什么??在AsyncTask有一个线程池,CORE_POOL_SIZE=5. 程序如何解决,帮帮我,谢谢!

4

2 回答 2

2

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

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

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

于 2012-06-18T05:58:44.363 回答
0

我自己也遇到过这个问题。我通过执行AsyncTasksin解决了它thread pool,而不是serial.

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

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

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

于 2012-06-18T20:01:39.813 回答