我正在开发一个Android应用程序,它向网站发出GET请求。出于某种原因,每次我发送此请求(点击按钮时发送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();
}
为什么会发生,我该如何解决这个问题?
更新我在日志消息中添加了。应用程序第一次发出GET请求时,只有前2个会显示给控制台。他们报告的信息是正确的,与第二次按下按钮时相同。第二次发出GET请求时,所有3条日志消息都会发送到控制台。由于某种原因,if(json!= null)的计算结果为false,并且它不会让其他日志语句执行。但这不应该发生,因为我已经打印了以前所包含的json。有什么想法吗?
UPDATE 2 对于一些背景知识,此应用程序向spotify音乐库发出GET请求,并返回我搜索的歌曲。我的应用程序发生了什么,在第一次调用时,没有返回id,但在第二次调用时,它返回第一次尝试时请求的歌曲的id。在第3次呼叫时,它返回第二次尝试时请求的歌曲的ID,依此类推。我尝试添加urlConnection.setConnectTimeout(1000*5);
和urlConnection.setReadTimeout(1000*5);
行,但仍存在同样的问题
答案 0 :(得分:0)
我现在没有足够的声誉发表评论。所以在这里发帖,
尝试以下:
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
}
并分享您的发现。