问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate: ");
String address = "https://www.wanandroid.com/article/list/1/json";
HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {
@Override
public void onFinish(String response) {//为什么这个方法里面没有执行到,是因为异步操作吗?
try {
Log.e(TAG, "onFinish: ");
JSONObject jsonObject = new JSONObject(response);
JSONObject jsonObject1 = jsonObject.getJSONObject("data");
JSONArray jsonArray = jsonObject1.getJSONArray("datas");
for (int i = 0; i < jsonArray.length(); i++) {
//datas数组里面的jsonObject
JSONObject jsonObject2 = jsonArray.getJSONObject(i);
HomeArticle homeArticle = new HomeArticle();
homeArticle.setChapterName(jsonObject2.getString("chapterName"));
homeArticle.setNiceShareDate(jsonObject2.getString("author"));
homeArticle.setTitle(jsonObject2.getString("title"));
homeArticle.setLink(jsonObject2.getString("link"));
homeArticle.setNiceShareDate(jsonObject2.getString("niceShareDate"));
homeArticle.setId(jsonObject2.getInt("id"));
mHomeArticleList.add(homeArticle);
Log.e(TAG, "onFinish: ");
// showResponse(mHomeArticleList);
}
} catch (Exception e) {
e.printStackTrace();
}
package com.example.http_recyclerview_demo;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 封装网络请求代码,内部开启了一个线程避免了网络请求耗时阻塞主线程,也是防止出现ANR,使用了java的接口回调机制,解决了在子线程无法返回从数据库获取到的数据
*/
public class HttpUtil {
public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {
HttpURLConnection connection = null;
try {
URL url = new URL(address);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream in = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
if (listener != null) {
//回调onFinish()方法,因为在子线程是没办法通过返回值return语句来返回网络获取到数据的
//所以将从服务器获取到数据传入了HttpCallbackListener接口的onFinish()方法
listener.onFinish(response.toString());
}
} catch (Exception e) {
if (listener != null) {
//回调onError()方法,如果出现了异常就将异常原因传入到onError方法
listener.onError(e);
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
if (listener != null) {
//回调onFinish()方法,因为在子线程是没办法通过返回值return语句来返回网络获取到数据的
//所以将从服务器获取到数据传入了HttpCallbackListener接口的onFinish()方法
if (response != null) listener.onFinish(response.toString());
}
} catch (Exception e) {
if (listener != null) {
//回调onError()方法,如果出现了异常就将异常原因传入到onError方法
listener.onError(e);
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
}).start();
}
}