在android上的应用程序上工作我使用了Asynctask类,当我在2.3.5上运行的Android设备上测试时工作正常,但我遇到的问题是,同样不能用于我的平板电脑4.0.4
在测试时,我们知道正在调用prexecute()但是没有调用doInbackground(),但是在设备上调用doInbackground()(2.3.5)。
我相信这个问题的原因之一是平板电脑的处理器比设备的处理器快得多,因此可能是一些线程问题,为什么要解决这个问题,我使用了一些标志,并使用了Thread。在while循环中sleep(),这样当条件为真时,它可以工作,但没有运气,我陷入循环本身。这是我的代码:
MyAsyncTask object = new MyAsyncTask (MainActivity.this);
runOnUiThread(new Runnable() {
public void run() {
try {
if (object.isReady() || !object.isStarting()) {
return;
}
object.execute();
do {
Thread.sleep(1000);
} while (!object.isReady() && object.isStarting());
if(!object.isReady()) {
return;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
AsynctaskClass:
public class MyAsyncTask extends AsyncTask<Void, Void, Boolean>{
private ProgressDialog dialog;
private Context context;
private boolean isStarting = false;
private boolean isReady = false;
public AsyncUpdatesofJquery(Context context) {
this.context = context;
isStarting = true;
isReady = false;
}
public boolean isStarting() {
return isStarting;
}
public boolean isReady() {
return isReady;
}
@Override
protected void onPreExecute() {
isStarting = true;
isReady = false;
dialog = new ProgressDialog(context);
dialog.setMessage("Downloading Files, Please wait...");
dialog.show();
}
@Override
protected Boolean doInBackground(Void... params) {
isReady = true;
isStarting = false;
downloadFiles(context); // my background task
return true;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
context.startActivity(new Intent(context, NewActivity.class));
dialog.dismiss();
isReady = false;
isStarting = false;
}
}
答案 0 :(得分:17)
多线程模型在2.3.5和4.0.4之间变化。 AsyncTask
现在默认使用相同的线程在应用程序中拥有所有子类(即,一次只能运行一个AsyncTask!)。它解释了here:
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。
考虑到这一点,可能是您的应用中正在运行另一个AsyncTask
,从而阻止了这个问题的启动。这可以解释为什么它在2.3.5设备上运行正常,但不适用于4.0.4平板电脑。