Java HttpURLConnection在第一次尝试时未返回任何内容。后续调用返回的值很好

Java HttpURLConnection在第一次尝试时未返回任何内容。后续调用返回的值很好,java,android,get,Java,Android,Get,我正在开发一个Android应用程序,它可以向网站发出GET请求。出于某种原因,每次我发送此请求(单击按钮时发送GET request),第一次尝试不会返回任何内容,但第二次尝试有效。第一次尝试也不会导致任何错误 代码如下: Thread thread = new Thread(new Runnable(){ @Override public void run(){ URL url = null; try { url = n

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

代码如下:

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();
    }
为什么会发生这种情况?我如何解决这个问题

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


更新2对于一些背景信息,此应用程序向spotify音乐库发出GET请求,并返回我搜索的歌曲。我的应用程序的情况是,在第一次呼叫时,id没有返回,但在第二次呼叫时,它返回第一次尝试时请求的歌曲的id。在第三次调用时,它返回第二次尝试时请求的歌曲的id,依此类推。我尝试添加
urlConnection.setConnectTimeout(1000*5)
urlConnection.setReadTimeout(1000*5)行,但它仍然有同样的问题

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

请尝试以下操作:

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
}

分享你的发现。

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

请尝试以下操作:

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
}

并分享您的发现。

您是否检查了每个请求的urlString和json日志记录?您确定返回的值来自后续调用吗?请尝试使用con.setConnectTimeout(connectTimeout);con.setReadTimeout(socketTimeout);你能给出一个答案并告诉我把@Pravin放在哪里吗?为什么你不使用AsyncTask而不是线程?我认为这更方便。@jayeshsolanki93我更新了问题。如果您需要澄清,请告诉我您是否检查了每个请求的urlString和json日志?您确定返回的值来自后续调用吗?请尝试使用con.setConnectTimeout(connectTimeout);con.setReadTimeout(socketTimeout);你能给出一个答案并告诉我把@Pravin放在哪里吗?为什么你不使用AsyncTask而不是线程?我认为这更方便。@jayeshsolanki93我更新了问题。如果您需要澄清我的问题,请告知我,以包括日志声明。这些代码行实际上是在第一次调用时执行的,这是最后一条日志语句,但没有连接成功。请查看我问题中的更新2,它解释了这一点better@Michel,你能再检查一件事吗,您的第一个响应代码是HTTP_创建的类型,下一个是HTTP_OK类型吗?我更新了我的问题,以包含日志语句。这些代码行实际上是在第一次调用时执行的,这是最后一条日志语句,但没有连接成功。请查看我问题中的更新2,它解释了这一点better@Michel,请您再检查一件事,您的第一个响应代码是HTTP_创建的类型,下一个是HTTP_OK类型吗?