目前正在构建一个 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)
我正在这样做,因为在程序启动后大约 2-5 分钟后,AsyncTask
拒绝运行。也就是说,doInBackground
不会被调用,也不会onPostExecute
。DOES 被调用,创建新的onClick
AsyncTask 并运行执行代码,但doInBackground
没有被调用。
这是完全随机的。我没有做任何其他事情 - 只是在那里等待几分钟,然后再次单击按钮以查看这种情况。Handler
对于每隔指定时间使用 a和运行的服务也是如此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();
}
}
}
运行良好,doPeriodicTask
再次创建 AsyncTask 并调用执行代码,但从doInBackground
未被调用。例如,如果我更改PERIODIC_EVENT_TIMEOUT
为 8000,doInBackground
就会被调用。
想法?