dav*_*e21 6 android android-asynctask
在android上的应用程序上工作我使用了Asynctask类,当我在2.3.5上运行的Android设备上测试时工作正常,但是我面临的问题是,同样不能用于我的平板电脑4.0.4
在测试时,要知道prexecute()被调用但doInbackground()没有被调用,但是在设备上调用了doInbackground()(2.3.5).
我相信这个问题的原因之一是Tablet的处理器比设备的处理器要快得多,所以可能是一些线程问题,dats为什么要解决这个问题,我使用了一些标志,并使用了Thread.sleep()在一个while循环中,这样当条件为真时,它可以工作,但没有运气,我陷入循环本身.这是我的代码:
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();
}
}
});
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Tod*_*der 17
多线程模型在2.3.5和4.0.4之间变化. AsyncTask现在默认使用相同的线程在应用程序中拥有所有子类(即一次只能运行一个AsyncTask!).它在这里解释:
首次引入时,AsyncTasks在单个后台线程上串行执行.从DONUT开始,这被改为一个线程池,允许多个任务并行运行.从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误.
如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object []).
考虑到这一点,可能是另一个AsyncTask正在您的应用程序中运行,从而阻止这个开始.这可以解释为什么它在2.3.5设备上运行正常,但不适用于4.0.4平板电脑.
| 归档时间: |
|
| 查看次数: |
4972 次 |
| 最近记录: |