我有一个正在运行的任务,如果它失败了,我想再次运行它三次。问题在于Android因为试图在自己的内部运行任务而生气。什么是最好的解决方法?
代码(查看底部的task.callback
):
final GenericAsyncTask task = new GenericAsyncTask();
task.background = new Runnable() {
public void run() {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(GCMIntentService.this.host);
String addremove = "add";
if(register == false) addremove = "remove";
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("cmd", addremove));
nameValuePairs.add(new BasicNameValuePair("subscription_key", SUBSCRIPTION_KEY)); // unique per app
nameValuePairs.add(new BasicNameValuePair("token", str));
nameValuePairs.add(new BasicNameValuePair("os_family", "android"));
if(addremove.equals("remove")) nameValuePairs.add(new BasicNameValuePair("hard", "" + hard));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs);
httppost.setEntity(entity);
Log.i(LCHApplication.TAG, "Name Value Pairs: " + nameValuePairs.toString());
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
task.result = EntityUtils.toString(response.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
}
};
task.callback = new Runnable() {
public void run() {
try {
Log.i(LCHApplication.TAG, "registration response: " + task.result.toString());
} catch(Exception e) {
if(attempts++ < ATTEMPTS_LIMIT) {
// try to register the device again
task.execute();
} else {
Crashlytics.logException(e);
}
}
}
};
task.execute();
答案 0 :(得分:2)
问题在于Android因为试图在其内部运行任务而感到生气
除此之外,AsyncTask
是一次性使用对象。您无法重新execute()
AsyncTask
个实例。
解决这个问题的最佳方法是什么?
创建AsyncTask
的新实例。例如,您可以实现一个复制构造函数,可用于从先前执行的实例中克隆新实例。
或者,请勿使用AsyncTask
。
由于Android SDK中没有GenericAsyncTask
,我不能说,这对任何GenericAsyncTask
都有效。
答案 1 :(得分:1)
在实际任务中重试,不要重新运行它。如果您需要重新运行任务,请通过第三方进行。
答案 2 :(得分:0)
在这种情况下,我建议的方法是采用Handler,每次捕获异常时都会发布一条消息以供执行(最多3次)。我发现它更灵活的方法,特别是当你需要经常运行时某些任务。
private final Handler handler = new Handler() {
public void handleMessage(Message msg) {
if(msg.what == YOUR_MESSAGE_TYPE){
try {
Log.i(LCHApplication.TAG, "registration response: " + task.result.toString());
} catch(Exception e) {
if(attempts++ < ATTEMPTS_LIMIT) {
// try to register the device again
handler.sendEmptyMsg(YOUR_MESSAGE_TYPE);
} else {
Crashlytics.logException(e);
}
}
}
}
};
最后,您必须将其与后台HandlerThread相关联。