【发布时间】:2013-07-31 06:47:20
【问题描述】:
我正在制作一个 android 应用程序,它需要它从远程服务器获取一些信息,因此我必须在异步任务中发出 http 请求。现在的问题是响应有时需要超过 2 秒时间它确实给出了http超时异常,但大多数时候它工作得很好。所以我想实现当我收到http超时异常时我想再次重试请求的功能(再次尝试doinBackground,因为网络调用只能在主线程以外的线程中进行),因为它很可能会成功,并且所有需要从远程服务器获取的东西都将发生在CallRemoteServer() 方法中
现在在我的程序中我已经实现了类似的东西
new AsyncTask<Void, Void, Void>() {
private boolean httpResponseOK = true;
@Override
protected Void doInBackground(Void... params) {
try {
CallRemoteServer();
}
} catch (Exception e) {
httpResponseOK = false;
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if (httpResponseOK == false) {
//Show an alert dialog stating that unable to coonect
}
else
{
//update UI with the information fetched
}
});
有人可以建议我如何实现我上面提到的东西,我的意思是,如果我得到除了超时以外的其他异常而不是显示警报对话框,否则在显示无法显示的对话框之前重试至少五次 CallRemoteServer 方法连接。
我想不出任何好的方法来实现这个逻辑。
提前致谢
【问题讨论】:
-
在
doInBackground()方法中,捕获错误并设置一个标志,该标志将被发送回Activity,从那里您调用AsyncTask。如果设置了标志 - 然后重试AsyncClass.execute()。 -
没有什么可以阻止您在
doInBackground的AsyncTask方法中循环。只需使用int来计算循环并设置boolean以检查while循环。如果int超过 4 或boolean设置为true(对于成功的结果),则应退出while循环。 -
@Squonk 如果我使用 while 循环和简单的计数器逻辑,那么一旦我遇到异常,它将退出并转到 catch(Exception e) 行
标签: android exception-handling android-asynctask