如何在不创建另一个线程的情况下将计时器放入AsyncTask中?

时间:2011-08-03 03:35:15

标签: android android-asynctask

我有一个异步任务,用于连接到网站(Twitter)。在某些情况下(例如,当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 个答案:

答案 0 :(得分:8)

有很多方法可以做到这一点。在你的情况下,我可能会使用Handler.postDelayed。

在与AsyncTask相同的范围内创建一个标记为final的Handler对象

final Handler handler = new Handler();

然后从AsyncTask内部调用postDelayed以在必要时安排下一次运行:

    handler.postDelayed(new Runnable() {

        public void run() {
            new SmartTwitAsyncTask.execute(param);
        }
    }, 10000);

答案 1 :(得分:4)

我知道它的旧帖子但是为了像我这样的未来读者我不认为你应该将Thread.sleep(1000*10);放在onPostExecute中,因为这会阻止UI线程和{{1}的所有点1}}是让activetask无法工作。

你可以把它放在这里:

UIthread

它属于哪里。

答案 2 :(得分:0)

 @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
    }

}