AsyncTask运行5次,然后不运行doInBackground方法

时间:2012-06-18 05:48:40

标签: android android-asynctask

单击按钮调用此方法:

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。如何解决方案,帮帮我谢谢!

2 个答案:

答案 0 :(得分:2)

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

asyncTask应该是您运行的一次性事件,并且您只能假设如果执行了多个asyncTasks,则至少有一个将同时运行。

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

答案 1 :(得分:0)

我自己遇到过这个问题。我通过执行AsyncTasks中的thread pool而非serial解决了这个问题。

要做到这一点,你必须像这样调用你的AsyncTasks:

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

这应该可以解决你的问题。