2017-10-12 145 views
0

我在加载JSON时遇到了一些问题。Android Studio:获取URL的连接

我用this getJSON方法列在答案中,但它不起作用。我发现简单的connect()函数抛出了RuntimeException

这里是我的全班包括从另一个问题的getJSON方法:

private class GetUnis extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     HttpsURLConnection con = null; 
     try { 
      URL u = new URL(URL2); 
      con = (HttpsURLConnection) u.openConnection(); 

      con.connect(); 


      BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); 
      StringBuilder sb = new StringBuilder(); 
      String line; 
      while ((line = br.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      br.close(); 

      test = sb.toString(); 


     } catch (MalformedURLException ex) { 
      ex.printStackTrace(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } finally { 
      if (con != null) { 
       try { 
        con.disconnect(); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
     return null; 
    } 
} 

我打电话来是这样的:新GetUnis()执行();

编辑:这里是堆栈跟踪

java.lang.RuntimeException: An error occured while executing doInBackground() 
                        at android.os.AsyncTask$3.done(AsyncTask.java:304) 
                        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
                        at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
                        at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                        at java.lang.Thread.run(Thread.java:818) 
                       Caused by: java.lang.ClassCastException: com.android.okhttp.internal.http.HttpURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection 
                        at com.example.lukaskohl.myapplication.SelectUni$GetUnis.doInBackground(SelectUni.java:138) 
                        at com.example.lukaskohl.myapplication.SelectUni$GetUnis.doInBackground(SelectUni.java:131) 
                        at android.os.AsyncTask$2.call(AsyncTask.java:292) 
                        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                        at java.lang.Thread.run(Thread.java:818)  

+0

你有互联网许可证添加在清单 –

+0

@ColdFire是我做过 –

+0

张贴堆栈跟踪然后 –

回答

1

你可以把它从你UI线程你需要这样做在后台线程

基本上创建的AsyncTask和移动你的逻辑连接到那里

使用此代码获取json响应作为字符串:

/** 
    * This method returns the entire result from the HTTP response. 
    * 
    * @param url The URL to fetch the HTTP response from. 
    * @return The contents of the HTTP response. 
    * @throws IOException Related to network and stream reading 
    */ 
    public static String getResponseFromHttpUrl(URL url) throws IOException { 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     try { 
      InputStream in = urlConnection.getInputStream(); 

      Scanner scanner = new Scanner(in); 
      scanner.useDelimiter("\\A"); 

      boolean hasInput = scanner.hasNext(); 
      if (hasInput) { 
       return scanner.next(); 
      } else { 
       return null; 
      } 
     } finally { 
      urlConnection.disconnect(); 
     } 
    } 

这一个是检查互联网连接,将帮助你避免调用这个任务,当用户离线

public static boolean isNetworkAvaliable(Context ctx) { 
     ConnectivityManager connectivityManager = (ConnectivityManager) ctx 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     return ((connectivityManager 
       .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null && connectivityManager 
       .getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED) 
       || (connectivityManager 
       .getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && connectivityManager 
       .getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
       .getState() == NetworkInfo.State.CONNECTED)) ; 
    } 








    private class GetUnits extends AsyncTask<URL, Void, String> { 


     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected String doInBackground(URL... params) { 
      URL Url = params[0]; 

      String searchResults = null; 
      try { 
       searchResults =getResponseFromHttpUrl(Url); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      if(searchResults!=null){ 
       try { 
        JSONArray unitsArray = new JSONArray(searchResults); 
        // do something cool with units 
//// TODO: 02/08/2017 
       }catch (Exception e){ 
        e.printStackTrace(); 
        Log.e("Places","error "+e); 
       } 

      return searchResults; 
     } 

     @Override 
     protected void onPostExecute(String searchResults) { 



     } 
    } 
+0

我试过了,它似乎仍然工作 –

+0

更新代码 –

+0

'.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)!= null && connectivityManager'。此行引发RuntimeException。另外.getNetworkInfo已弃用。 –

0

您铸造错要么投既javax.net.ssl.HttpsURLConnectioncom.android.okhttp.internal.http.HttpURLConnectionImpl

con = (HttpsURLConnection) u.openConnection(); 
+0

这只是调试代码。如果connect()被遗漏,它确实工作。 –

+0

发布新的异常,那么当你不使用调试代码时你会得到什么 –