java android应用程序无法使http获取

时间:2018-05-21 20:20:45

标签: java android

有人可以帮助我从网上获取json。在函数结束时,jsonResponse为空。我用这种方法来做到这一点:

 private String getJson() {

    jsonResponsce = "";

    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            try{

                URL httpbinEndpoint = new URL(webPage);
                HttpsURLConnection myConnection = (HttpsURLConnection) httpbinEndpoint.openConnection();

                myConnection.setRequestMethod("GET");

                // Enable writing
                myConnection.setDoOutput(true);

                String internetData = "";

                // Write the data
                myConnection.getOutputStream().write(internetData.getBytes());

                jsonResponsce = internetData;

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

    return jsonResponsce;
}

我为清单设置了Internet权限。我尝试从下一个地址获取Json:https://shori-dodjo-mobile-app.firebaseio.com/.json。完整代码放在此处:https://github.com/GenkoKaradimov/Shori-Dodjo-Android-App/

4 个答案:

答案 0 :(得分:0)

您正在异步执行请求,因此该方法开始执行然后完成,因此没有结果。结果将在第二个,但到那时方法getJson已经完成。您最有可能需要在运行方法的末尾放置使用json的代码。

此外,您从流中读取的代码似乎有误。它可能应该像

BufferedReader br = new BufferedReader(new InputStreamReader(myConnection.getInputStream()));

jsonResponsce = br.lines().collect(Collectors.joining("\n"));

(我没有测试过这个)

答案 1 :(得分:0)

您的代码中存在多个问题:

首先,AsyncTask意味着它是异步(hronous),因此您无法立即返回结果。相反,覆盖AsyncTaskonPostExecute并执行您需要处理的数据。 Here是示例实现。

其次,您正在使用getOutputStream,用于写入连接,即将数据发送到服务器。在您的情况下,您需要getInputStream并从中读取。最简单的方法是将它包装在BufferedReader中并读取,直到它返回-1(标记流的结尾),然后转换为字符串。

有一些怪癖:您应该通过检查HTTP状态代码,处理编码(转换字节到字符串部分)以及处理压缩响应时的情况来处理或至少识别错误,例如:使用DEFLATE或gzip。我已经以纯Java方式实现了这一点(reference code,警告:过时的文档),但我认真地建议使用已建立的库之一,例如RetrofitVolley。< / p>

答案 2 :(得分:0)

我认为你最好不要使用Volley。以下是一个很好的用法示例:https://stackoverflow.com/a/42601290/1450032

答案 3 :(得分:-1)

Json对象通常以HashMaps的形式返回。 所以你可能需要像HashMap这样的东西你的地图=新的HashMap&lt;〜&gt;(); 然后 yourMap.get(&#34;对方名称在另一边&#34;,var也被保存。); 现在看起来你要做的就是保存字节数据,但这个字节数据需要有一个类型。希望这可以帮助。