Android应用程序在找不到URL时崩溃

时间:2017-10-27 04:39:25

标签: java android resttemplate

在我的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);


        }

    }

2 个答案:

答案 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的空条件。