Android Studio:连接到 URL

Android Studio: Get a connection to a URL

我在将 JSON 加载到我的项目中时遇到了一些麻烦。

我使用了答案中列出的 getJSON 方法,但它不起作用。我发现 connect() 函数只是抛出一个 RuntimeException.

这是我的全部 class,包括来自另一个问题的 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;
    }
}

我这样称呼它:new GetUnis().execute();

编辑:这是 StackTrace

java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                                   at android.os.AsyncTask.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.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.call(AsyncTask.java:292)
                                                                                   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                   at android.os.AsyncTask$SerialExecutor.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) 

您可以从您的 ui 线程中调用它 您需要在后台线程中执行此操作

基本上创建一个异步任务并将您的逻辑移动到那里

使用此代码将 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) {



        }
    }

你投错了要么都投到javax.net.ssl.HttpsURLConnection要么投到com.android.okhttp.internal.http.HttpURLConnectionImpl

  con = (HttpsURLConnection) u.openConnection();