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)

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呼び出されます。

アイデア?

4

0 に答える 0