Как я могу поставить таймер в AsyncTask без создания другого потока? - PullRequest
1 голос
/ 03 августа 2011

У меня есть асинхронная задача, которую я использую для подключения к веб-сайту (Twitter).В определенных ситуациях (например, когда не удается обновить пост в Твиттере), я хочу подождать 10 секунд, прежде чем пытаться снова.Поскольку я уже выполняю асинхронную задачу, я не хочу запускать другой поток для таймера.

Любые предложения были бы отличными :).Код ниже ...

        class SendTwitAsyncTask extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... params) {



        String tokenTwit = params[0];
        String tokenSecretTwit = params[1];
        String strMessageBody = params[2];

        AccessToken aToken = new AccessToken(tokenTwit, tokenSecretTwit);



        // initialize Twitter4J
        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        twitter.setOAuthAccessToken(aToken);
        aToken=null;

        // create a tweet
        Date d = new Date(System.currentTimeMillis());
        String tweet = strMessageBody;

        try {

        status = twitter.updateStatus(tweet);


        // feedback for the user..
        showNotification("Twitter", TWIT_SUCCESS);  

    } catch (TwitterException te) {



        showNotification("Twitter ", TWIT_FAIL);
        te.printStackTrace();

                       //TO DO
                       //POSTING TWEET HAS FAILED.  TRY AGAIN IN 10 SECONDS


    }

        return null;
    }



} //end class SendTwitAsyncTask

Ответы [ 3 ]

8 голосов
/ 03 августа 2011

Есть много способов сделать это.Я бы, наверное, пошел с Handler.postDelayed в вашем случае.

Создайте объект Handler, помеченный как final, в той же области, что и ваш AsyncTask

final Handler handler = new Handler();

Затем вызовите postDelayed из AsyncTask для планированияследующий прогон, где необходимо:

    handler.postDelayed(new Runnable() {

        public void run() {
            new SmartTwitAsyncTask.execute(param);
        }
    }, 10000);
4 голосов
/ 24 ноября 2011

Я знаю, что это старая ветка, но ради будущих читателей, таких как я, я не думаю, что вы должны поместить Thread.sleep(1000*10); в onPostExecute, потому что это заблокирует поток пользовательского интерфейса, и вся цель activetask - оставить UIthread свободным работы.

Вы можете поставить его здесь:

protected String doInBackground(String... params) {

где он принадлежит.

0 голосов
/ 03 августа 2011
 @Override
    protected String doInBackground(String... params) {



        String tokenTwit = params[0];
        String tokenSecretTwit = params[1];
        String strMessageBody = params[2];

        AccessToken aToken = new AccessToken(tokenTwit, tokenSecretTwit);



        // initialize Twitter4J
        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        twitter.setOAuthAccessToken(aToken);
        aToken=null;

        // create a tweet
        Date d = new Date(System.currentTimeMillis());
        String tweet = strMessageBody;

        try {

        status = twitter.updateStatus(tweet);


        // feedback for the user..
        showNotification("Twitter", TWIT_SUCCESS);  

    } catch (TwitterException te) {



        showNotification("Twitter ", TWIT_FAIL);
        te.printStackTrace();

                       //TO DO
                       //POSTING TWEET HAS FAILED.  TRY AGAIN IN 10 SECONDS
                       return status;

    }

        return status;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
    if(status.equals("failed"))
    {
    Thrad.sleep(1000*10);
    new SmartTwitAsyncTask.execute(param);

    }
    if(status.equals("success"))
    {
    //proceed
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...