我有一个异步任务,用于连接到网站(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
答案 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
}
}