【问题标题】:Android app is crashing on not finding URLAndroid 应用程序因找不到 URL 而崩溃
【发布时间】: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


【解决方案1】:

当网络错误发生异常时,server_response 的值不会被设置为空。

您可以使用&lt;String, String, Boolean&gt; 作为AsyncTask 的类型,并在catch 块内返回false,以便在onPostExecute 方法内检查布尔结果是否获得结果。如果结果为 false,则可以显示错误 toast 并返回。

或者,您还可以在 onPostExecute 方法中使用值之前检查值 server_response 的空条件。

【讨论】:

    【解决方案2】:

    由于不同的原因,您还需要处理诸如此类的多个异常,您只捕获了 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
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多