2017-10-12 143 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

發佈新的異常,那麼當你不使用調試代碼時你會得到什麼 –