在 Android 应用中,我使用了 Asynctask 类。在我的运行 Android 2.3.5 的设备上测试时,它能正常工作。但是我遇到的问题是,在我的平板电脑 4.0.4 上无法正常工作。
在测试过程中,我发现 prexecute() 被调用了,但 doInbackground() 没有被调用,然而在设备(2.3.5)上 doInbackground() 被调用。
我认为问题的一个原因可能是平板电脑的处理器比设备的处理器快得多,所以可能会出现一些线程问题。为了解决这个问题,我使用了一些标志,并在 do while 循环中使用 Thread.sleep(),以便在条件为 true 时它可以工作,但没有成功,我陷入了循环中。以下是我的代码:
在测试过程中,我发现 prexecute() 被调用了,但 doInbackground() 没有被调用,然而在设备(2.3.5)上 doInbackground() 被调用。
我认为问题的一个原因可能是平板电脑的处理器比设备的处理器快得多,所以可能会出现一些线程问题。为了解决这个问题,我使用了一些标志,并在 do while 循环中使用 Thread.sleep(),以便在条件为 true 时它可以工作,但没有成功,我陷入了循环中。以下是我的代码:
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();
}
}
});
异步任务类:
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;
}
}
isStarting
和isReady
时,它们应该是易失性的或更好地使用AtomicBoolean
。 - olshevskirunOnUiThread()
调用的任何目的。 - olshevskidoInBackground
没有被执行吗?你调试过它的调用了吗?我非常确定你只是因为while
循环的错误条件而陷入了无限循环。 - olshevski