【问题标题】:Android Studio: Get a connection to a URLAndroid Studio:获取到 URL 的连接
【发布时间】:2018-03-24 18:13:37
【问题描述】:

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

我使用了答案中列出的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;
    }
}

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

编辑:这里是 StackTrace

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) 

 

【问题讨论】:

  • 你有没有在 manifest 中添加互联网权限
  • @ColdFire 是的,我做到了
  • 然后发布堆栈跟踪
  • 为什么不用Retrofit2,它会更容易编码和阅读
  • 您是否在清单和应用设置中都设置了互联网权限?

标签: android json android-studio httpwebrequest webrequest


【解决方案1】:

您可以从您需要在后台线程中执行此操作的 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) {



        }
    }

【讨论】:

  • '.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null && connectivityManager'。此行会引发 RuntimeException。 .getNetworkInfo 也已弃用。
  • 你还需要这个权限才能工作
  • 我得到了真正的返回值。其他函数也在以下行抛出异常: InputStream in = urlConnection.getInputStream();
  • 什么是 URL 2?您需要传入 URL 或现场构建它
  • URL2 是 URL 的实际字符串。我在将其传递给 getResponseFromHttpUrl 之前构建了真实的 URL
【解决方案2】:

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

  con = (HttpsURLConnection) u.openConnection();

【讨论】:

  • 这只是调试代码。如果 connect() 被忽略,它确实有效。
  • 发布新的异常,然后你在不使用调试代码时得到什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 2014-08-27
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多