2011-08-03 43 views
1

我有一個異步任務,用於連接到網站(Twitter)。在某些情況下(例如,Twitter發佈更新失敗時),我想等10秒鐘後再嘗試。由於我已經在異步任務中,我不想爲計時器啓動另一個線程。如何在不創建另一個線程的情況下在AsyncTask中放置一個計時器?

任何建議將是偉大的:)。下面 代碼...

 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 
+0

另一個線程真的是最好的方法,但是如果你使用[TimerTask] [1],這個線程非常簡單。 [1]:http://Another%20thread%20really%20would%20be%20the%20best%20way%20to%20do%20this.%20You%20can%20use%20a%20%5BTimerTask%5D%5B1% 5D。 – Phil

+0

我試圖添加更多東西給你的代碼..嘗試,如果它的作品/ .. – ngesh

回答

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 
    } 

} 
8

有很多方法可以做到這一點。我可能會在你的情況下使用Handler.postDelayed。

創建Handler對象標記決賽在相同的範圍內您的AsyncTask

final Handler handler = new Handler(); 

然後調用postDelayed從的AsyncTask內安排下一次運行,在必要時:

handler.postDelayed(new Runnable() { 

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

我知道這是老線程,但爲了未來像我這樣的讀者,我不認爲你應該把Thread.sleep(1000*10);onPostExecute因爲這將阻止UI線程和所有點activetask是保持UIthread頻率工作。

你可以把它放在這裏:

protected String doInBackground(String... params) { 

屬於它的地方。

相關問題