Asynctask クラスを使用した Android のアプリで作業しています。2.3.5 で実行されている Android デバイスでテストしたときに正常に動作しますが、直面している問題は、同じことがタブレット 4.0.4 でも機能しないことです。
テスト中に、 preexecute() が呼び出されているが doInbackground() が呼び出されていないことを知りましたが、デバイス(2.3.5)で doInbackground() が呼び出されています。
この問題の原因の 1 つは、タブレットのプロセッサがデバイスのプロセッサよりもはるかに高速であるため、スレッドの問題である可能性があります。これに取り組むために、いくつかのフラグを使用し、Thread.sleep() を使用しました。 do while ループで、条件が 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;
}
}