目前正在构建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
也不会被调用。调用onClick
DOES,创建新的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();
}
}
}
doPeriodicTask
运行正常,再次创建AsyncTask并调用执行代码,但doInBackground
永远不会被调用。例如,如果我将PERIODIC_EVENT_TIMEOUT
更改为8000,则doInBackground
会被称为罚款。
想法?