Android AsyncTask不调用doInBackground方法
这是我的密码:Android AsyncTask不调用doInBackground方法,android,android-asynctask,Android,Android Asynctask,这是我的密码: new Loading.LoadTast(ctx) { @Override protected String doInBackground(Integer... params) { Looper.prepare(); String msg=changePwd(); closeProgressDialog();
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);
}
}
new Loading.LoadTast(ctx){
@凌驾
受保护字符串doInBackground(整数…参数){
Looper.prepare();
字符串msg=changePwd();
closeProgressDialog();
如果(msg==null){
SmartNgApplication.getInstance().exit();
}否则{
BaseHelper.showtoos(ctx,msg);
}
loop.loop();
返回null;
}
}.execute();
公共抽象静态类LoadTast扩展了AsyncTask{
私有进程对话;
私有上下文ctx;
公共LoadTast(上下文ctx){
这个.ctx=ctx;
}
受保护的抽象字符串doInBackground(整数…参数);
公共无效onPreExecute(){
super.onPreExecute();
progressDialog=progressDialog.show(ctx,“,”加载…”,true,false);
}
public void onPostExecute(字符串结果){
super.onPostExecute(结果);
progressDialog.disclose();
BaseHelper.showtoos(ctx,result);
}
}
单击按钮以运行该方法。单击它5次AsyncTask.onPreExecute
会被调用,但不会调用doInBackground
,因此屏幕仍然显示一个对话框
我认为AsyncTask
THREAD\u POOL\u EXECUTOR
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);
}
}
公共抽象类AsyncTaskWrapper
扩展异步任务{
@凌驾
最终保护结果doInBackground(参数…参数){
返回wrappedDoInBackground(参数);
}
受保护的抽象结果包装背景(Params…Params);
受保护的抽象无效wrappedOnPostExecute(结果);
最终受保护的void onPostExecute(结果){
wrappedOnPostExecute(结果);
}
}
正如托德·斯约兰德在《美国历史》中所说的那样
多线程模型在2.3.5和4.0.4之间更改。异步任务
现在默认情况下,应用程序中的所有子类都使用相同的
线程(即一次只能运行一个异步任务!)。已经解释过了
在这里:
首次引入时,AsyncTasks是在单个服务器上串行执行的
背景线程。从甜甜圈开始,它被改成了一个
允许多个任务并行运行的线程。从
蜂窝,任务在单个线程上执行,以避免常见的
并行执行导致的应用程序错误
如果确实需要并行执行,可以调用
executeOnExecutor(java.util.concurrent.Executor,对象[])与
线程池执行器
考虑到这一点,可能有另一个AsyncTask正在运行
您的应用程序,从而阻止此应用程序启动。那会
解释为什么它可以在2.3.5设备上正常工作,但不能在4.0.4设备上正常工作
平板电脑
为什么覆盖
doInBackground()
方法如此重要?为什么不把它放在AsyncTask
中呢?因为new Loading.LoadTast(ctx)在许多类中调用,我不想在不需要的每个类上都编写onPreExecute方法?创建类之后,只需调用newloadtast.execute([int params])代码>此外,您需要声明异步任务
将使用哪些变量,例如公共抽象静态类LoadTast扩展异步任务{
对不起,在我的代码中有“Amen”。有关异步任务的更多信息,请参阅此博客帖子