現在、Android アプリを構築し、4.1.1 を実行している Genymotion で確認しています。AsyncTask
テキストから翻訳するために Bing Translate API を呼び出すために使用しています。
class TranslateFacebookText extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... message) {
String translatedText = "";
try {
translatedText = Translate.execute(message[0], Language.AUTO_DETECT, Language.ENGLISH);
} catch (Exception e) {
....
}
return translatedText;
}
@Override
protected void onPostExecute(String translatedText) {
message = translatedText;
confirmTTSData();
}
}
public void onClick(View src) {
TranslateFacebookText translateTask = new TranslateFacebookText();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
translateTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, message);
}
else {
translateTask.execute(message);
}
}
この質問を読んだ後、このメソッドを使用してタスクを開始しています: Android SDK AsyncTask doInBackground not running (subclass)
AsyncTask
プログラムの開始から約2〜5分後、実行を拒否するので、私はそうしています。つまりdoInBackground
、 も呼び出されませんonPostExecute
。DOES が呼び出され、onClick
新しい AsyncTask が作成され、実行コードが実行されますが、doInBackground
は呼び出されません。
これは完全にランダムです。私は他に何もしていません。数分間待ってから、ボタンをもう一度クリックして、これが起こることを確認します。Handler
これは、およびを使用して指定された時間ごとに実行されるサービスにも当てはまりますpostDelayed
。次に例を示します。
public class MyService extends Service {
private Handler periodicEventHandler;
private final int PERIODIC_EVENT_TIMEOUT = 600000;
@Override
public void onCreate() {
periodicEventHandler = new Handler();
periodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT);
}
private Runnable doPeriodicTask = new Runnable()
{
public void run()
{
TranslateFacebookText translateTask = new TranslateFacebookText();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
translateTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, message);
}
else {
translateTask.execute(message);
}
periodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT);
}
};
class TranslateFacebookText extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... message) {
String translatedText = "";
try {
translatedText = Translate.execute(message[0], Language.AUTO_DETECT, Language.ENGLISH);
} catch (Exception e) {
....
}
return translatedText;
}
@Override
protected void onPostExecute(String translatedText) {
message = translatedText;
confirmTTSData();
}
}
}
正常に実行され、再びAsyncTaskdoPeriodicTask
が作成され、実行コードが呼び出されますが、doInBackground
呼び出されることはありません。PERIODIC_EVENT_TIMEOUT
たとえば、8000に変更すると、正常にdoInBackground
呼び出されます。
アイデア?