单击按钮调用此方法:
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
。如何解决方案,帮帮我谢谢!
答案 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);
这应该可以解决你的问题。