【问题标题】:HttpURLConnection not returning anything on first attempt. Subsequent calls return values just fineHttpURLConnection 在第一次尝试时未返回任何内容。后续调用返回值就好了
【发布时间】:2017-01-19 05:21:06
【问题描述】:

我正在开发一个向网站发出 GET 请求的 Android 应用。出于某种原因,每次我发送此请求(单击按钮时发送 GET 请求)时,第一次尝试不会返回任何内容,但第二次尝试有效。第一次尝试也不会导致任何错误。

代码如下:

Thread thread = new Thread(new Runnable(){
    @Override
    public void run(){
        URL url = null;
        try {
            url = new URL(urlString);
            Log.d("testJson", "URL" + urlString);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        HttpURLConnection urlConnection = null;
        try {
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setConnectTimeout(1000*5);
            urlConnection.setReadTimeout(1000*5);
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            json = readStream(in);
            Log.d("testJson", "json" + json);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            urlConnection.disconnect();
        }
    }
});
thread.start();

JSONObject jObj;
JSONObject tracks;
JSONArray items;

if (json != null) {
    try {

        jObj = new JSONObject(json);
        tracks = (JSONObject) jObj.get("tracks");
        items = (JSONArray) tracks.get("items");
        id = items.getJSONObject(0).getString("id");
        Log.d("testJson", id);

        // ... more code
    catch (JSONException e) {
        e.printStackTrace();
    }

为什么会发生,我该如何解决这个问题?

UPDATE 我在日志消息中添加。应用程序第一次发出 GET 请求时,只有前 2 个会显示到控制台。他们报告的信息是正确的,并且与第二次按下按钮时相同。我第二次发出 GET 请求时,所有 3 条日志消息都发送到控制台。由于某种原因, if (json != null) 的计算结果为 false 并且它不会让其他日志语句执行。但这不应该发生,因为我已经打印了 json 之前包含的内容。有什么想法吗?

更新 2 作为背景知识,这个应用程序向 spotify 音乐库发出 GET 请求,并返回我搜索的歌曲。我的应用程序发生的情况是,在第一次调用时,没有返回 id,但在第二次调用时,它返回了第一次尝试请求的歌曲的 id。在第 3 次调用时,它返回第二次尝试时请求的歌曲的 id,依此类推。我已经尝试添加 urlConnection.setConnectTimeout(1000*5);urlConnection.setReadTimeout(1000*5); 行,但它仍然有同样的问题

【问题讨论】:

  • 您是否检查了每个请求的 urlString 和 json 记录?您确定返回的值来自后续调用吗?
  • 试试 con.setConnectTimeout(connectTimeout); con.setReadTimeout(socketTimeout);
  • 你能发布一个答案并显示我会把@Pravin放在哪里吗?
  • 为什么不使用 AsyncTask 而不是 Thread ?我认为它更方便。
  • @jayeshsolanki93 我更新了这个问题。如果您需要澄清,请告诉我

标签: java android get


【解决方案1】:

我现在没有足够的声望来发表评论。所以在这里发帖,

尝试以下:

urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.connect();
if(urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK ||
    urlConnection.getResponseCode() == HttpURLConnection.HTTP_CREATED) {
    Log.d("Testing","urlConnection is success");
    InputStream in = new BufferedInputStream(urlConnection.getInputStream());
    json = readStream(in);
} else {
    Log.d("Testing","urlConnection failed");
    InputStream in = new BufferedInputStream(urlConnection.getErrorStream());
    errorMsg = readStream(in);
    // try printing this error message
}

并分享您的发现。

【讨论】:

  • 我更新了我的问题以包含日志语句。这些代码行实际上是在第一次调用时执行的,它是最后一个不执行的日志语句
  • 连接从一开始就成功,请查看我的问题中的 UPDATE 2,它解释得更好
  • @Michel,您能否再检查一下,您的第一个响应代码是 HTTP_CREATED 类型,然后是 HTTP_OK 类型吗?
猜你喜欢
  • 2022-10-02
  • 1970-01-01
  • 2020-05-15
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多