Android上的AsyncTask在2-5分钟后停止工作

时间:2013-11-14 23:36:31

标签: java android android-asynctask

目前正在构建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不会被调用。

这完全是随机的。我没有做任何其他事情 - 只是在那里等了几分钟,然后再次点击按钮看到这种情况发生了。对于使用HandlerpostDelayed在指定时间运行的服务,情况也是如此。这是一个例子:

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会被称为罚款。

想法?

0 个答案:

没有答案