【发布时间】:2018-04-08 14:53:54
【问题描述】:
在我的 android 活动中,我使用 AsyncTask 通过 restTemplate 从服务器获取数据,它运行良好。我在我的 Intranet 环境中使用 wifi 在我的移动设备中对其进行测试,因为服务器是供内部用户使用的,并且我能够从服务器获取数据。但问题是我突然关闭 wifi 或更改网络,应用程序崩溃 (连接超时)。我知道我的应用程序尝试获取数据的 URL 无法从 Internet 访问,但如何防止应用程序崩溃或显示一些通知,例如没有网络。我的代码是
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);
}
}
【问题讨论】:
-
与问题分享您的崩溃日志
-
需要先检查网络连接是否可用,然后再建立连接。如果连接断开,仍然可能会出现问题。需要查看崩溃日志,因为可能会发生其他事情。
-
分享你的日志猫
-
如果你想重试 HTTP 连接,你应该使用比 AsyncTask 更好的网络库。 AsyncTask 不需要执行 HTTP,只是为了让网络脱离主线程。
-
@Tigger:如何检查网络连接。我尝试了 ConnectivityManager 和 NetworkInfo,但应用程序仍然崩溃。原因可能是网络已连接到互联网,但如何检查特定 URL 是否可访问
标签: java android resttemplate