这是我的代码:
new Loading.LoadTast(ctx) {
@Override
protected String doInBackground(Integer... params) {
Looper.prepare();
String msg=changePwd();
closeProgressDialog();
if(msg == null) {
SmartNgApplication.getInstance().exit();
} else {
BaseHelper.showToast(ctx, msg);
}
Looper.loop();
return null;
}
}.execute();
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);
}
}
单击按钮以运行该方法。点击AsyncTask.onPreExecute
5次,但不会调用doInBackground
,因此屏幕仍会显示对话框。
我认为AsyncTask
THREAD_POOL_EXECUTOR
答案 0 :(得分:2)
您不应该在doInBackground中调用任何UI更改方法。那就是onPostExecute的用途。只做doInBackground中UI线程上不允许的内容。
要检查为什么不调用doInBackground,请尝试将实现(从匿名内部类)放入LoadTast,看看它是否被调用。
我已经通过将子类调用重命名为onPostExecute和doInBackground来实现AsyncWrapper。应该可以在匿名内部类中覆盖包装的方法,就像您在示例中使用的那样。
这是简短版本。我的真实代码涉及一些通用异常处理,而不仅仅是对包装方法的调用。
public abstract class AsyncTaskWrapper<Params, Progress, Result>
extends AsyncTask<Params, Progress, Result> {
@Override
final protected Result doInBackground(Params... params) {
return wrappedDoInBackground(params);
}
protected abstract Result wrappedDoInBackground(Params... params);
protected abstract void wrappedOnPostExecute(Result result);
final protected void onPostExecute(Result result) {
wrappedOnPostExecute(result);
}
}
答案 1 :(得分:1)
正如Todd Sjolander在this thread中所说的那样......
多线程模型在2.3.5和4.0.4之间变化。的AsyncTask 现在默认使用相同的应用程序中的所有子类 线程(即一次只能运行一个AsyncTask!)。它解释了 这里:
首次引入时,AsyncTasks在单个上串行执行 背景线程。从DONUT开始,这被改成了一个池 允许多个任务并行运行的线程。从...开始 HONEYCOMB,任务在单个线程上执行以避免常见 并行执行导致的应用程序错误。
如果您真的想要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,Object [])with THREAD_POOL_EXECUTOR。
考虑到这一点,可能是另一个AsyncTask正在运行 你的应用程序,从而阻止这个开始。那会 解释为什么它在2.3.5设备上运行正常,但不是4.0.4 片剂。