0

目前正在构建一个 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 被调用,创建新的onClickAsyncTask 并运行执行代码,但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就会被调用。

想法?

4

0 回答 0