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メソッドは呼び出されず、画面は常にロードを実行します。コードは実行されていると思いますが、実行さonPreExecuteれていませんdoInbackground。どうして??にはAsyncTaskスレッド プールがありますCORE_POOL_SIZE=5。プログラムの解決方法、助けてください ありがとうございます!

4

2 に答える 2

2

asyncTask は doInBackground を複数回実行することは想定されておらず、ループ スレッドであることも想定されていません。

asyncTask は一度だけ実行するものであり、複数の asyncTask が実行された場合、少なくとも 1 つが同時に実行されると想定することしかできません。

私が気付いた別のこと:closeProgressDialog内から呼び出しましたdoInBackgroundが、それは UI 関連の操作であり、doInBackgroundが非 UI スレッドで実行されています。

于 2012-06-18T05:58:44.363 に答える
0

私はこの問題を自分で抱えていました。AsyncTasksthread pool代わりに を実行することで解決しましたserial

これを行うには、次のように AsyncTasks を呼び出す必要があります。

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

それはあなたが抱えている問題を解決するはずです。

于 2012-06-18T20:01:39.813 に答える