在我的android活动中,我使用AsyncTask从服务器使用 restTemplate 获取数据,并且它运行正常。我在我的内部网环境中使用wifi在我的移动设备上测试它,因为服务器是内部用户的,我可以从服务器获取数据。但问题是突然我关闭wifi或更改网络,应用程序崩溃(连接超时)。我知道我的应用尝试获取数据的网址无法通过互联网访问,但如何阻止应用崩溃或显示某些通知,例如没有网络。我的代码是
private class AsyncTaskRunner extends AsyncTask<String, String, Void> {
@Override
protected Void doInBackground(String... params) {
String username = "user";
String password = "pass";
String getAllItems = "http://172.16.243.15:8080/myapp/restGetAllItem";
HttpAuthentication authHeader = new HttpBasicAuthentication(username, password);
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAuthorization(authHeader);
requestHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
final RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
try{
ResponseEntity<List> responseEntity=restTemplate.exchange(getAllItems, HttpMethod.GET, new HttpEntity<Object>(requestHeaders), List.class);
server_response=responseEntity.getBody();
System.out.println("server response size is"+server_response.size());
} catch (HttpClientErrorException e){
}
return null;
}
@Override
protected void onPostExecute(Void v){
ProgressBar progressBar=(ProgressBar)getView().findViewById(R.id.progressBar);
progressBar.setVisibility(getView().GONE);
RecyclerView recyclerView = (RecyclerView) getView().findViewById(R.id.card_recycler_view);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
DataAdapter adapter = new DataAdapter(getContext(), server_response);
recyclerView.setAdapter(adapter);
}
}
答案 0 :(得分:0)
您还需要处理多个异常,例如由于不同的原因,您只捕获了CLienErrorException
还添加这样的内容来处理异常
try{
//Your Connection Code
} catch (HttpClientErrorException e){
Log.e(LOG_TAG, "Client Error", e);
// Do something else, if wanted.
}
catch (InterruptedIOException iioe)
{
// Exception thrown when network timeout occurs
System.err.println ("Remote host timed out during read operation");
}
catch (IOException e)
{
Log.e(LOG_TAG, "Connection Error", e);
// Do something else, if wanted.
}
catch(Exception e)
{
//Do Something
}
finally
{
//Do Something
}
答案 1 :(得分:0)
当由于网络错误而发生异常时,将不会设置server_response
的值,从而使其为空。
您可以使用<String, String, Boolean>
作为AsyncTask
的类型,并在catch块内返回false,以便在onPostExecute
方法内部检查布尔结果是否获得结果。如果结果为false,则可以显示错误toast并返回。
或者,您也可以在server_response
方法中使用之前检查值onPostExecute
的空条件。