1.网络操作基础知识
(1)HTTP:超文本传送协议(客户端每次请求都需要服务器回送响应,并在请求结束后主动释放连接)
HTTPS:HTTP的安全版,在HTTP下加入了SSL层。
(2)网络操作需要的类:URL类是用来管理网址的,HttpURLConnection用来管理网络连接,InetAddress用来操作IP地址
(3)JSON:一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便;解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等
2.网络请求
2.1GET请求
(1)实例化一个URL对象
(2)打开它的链接,获取HttpURLConnection对象
(2)设置一些属性
(3)连接
(4)获取返回的信息(如返回码,返回信息),用于判断连接是否成功
(5)获取需要的数据:InputStream inputStream = connection.getInputStream();
2.2POST请求
(1)与GET请求相比属性设置略有不同
(2)连接以后,将要上传的数据打包
OutputStream outputStream = connection.getOutputStream();
outputStream.write(data.getBytes());//将要上传的数据写入输出流
outputStream.flush();
outputStream.close();
2.3数据解析
(1)将JSON数据映射为一个对象(JsonObject JsonArray)
LessonResult lessonResult = new LessonResult();
JSONObject jsonObject = new JSONObject(result);
List<LessonResult.Lesson> lessonList = new ArrayList<>();
int status = jsonObject.getInt("status");
JSONArray lessons = jsonObject.getJSONArray("data");
lessonResult.setStatus(status);
if(lessons != null && lessons.length() > 0){
for (int index = 0; index < lessons.length(); index++) {
JSONObject lesson = (JSONObject) lessons.get(index);
int id = lesson.getInt("id");
int learner = lesson.getInt("learner");
String name = lesson.getString("name");
String smallPic = lesson.getString("picSmall");
String bigPic = lesson.getString("picBig");
String description = lesson.getString("description");
LessonResult.Lesson lessonItem = new LessonResult.Lesson();
lessonItem.setID(id);
lessonItem.setName(name);
lessonItem.setSmallPictureUrl(smallPic);
lessonItem.setBigPictureUrl(bigPic);
lessonItem.setDescription(description);
lessonItem.setLearnerNumber(learner);
lessonList.add(lessonItem);
}
lessonResult.setLessons(lessonList);
}
mTextView.setText(lessonResult.toString());
3.网络操作注意事项
(1)网络请求通常是很耗时的操作,所以需要另开一个线程来处理网络请求`
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
(2)在mainfest中声明网络权限
<uses-permission android:name="android.permission.INTERNET"/>
(3)
遇到的问题:
1.获取数据失败
原因:HTTP域名不被允许,9.0版本新特性造成的。
解决方法:
(1)创建安全配置文件:创建xml/network_security_config.xml文件 ,在文件里面增加cleartextTrafficPermitted属性
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted = "true"/>
</network-security-config>
(2)然后在mainfest文件的application标签中声明android:networkSecurityConfig="@xml/network_security_config"
2.无法更新TextView
原因:更新UI只能在主线程中更新,我们在网络线程中setText(),故失败。
解决方法:在网络线程中调用UI线程专门来更新UI:
runOnUiThread(new Runnable() {
@Override
public void run() {
mResult = decode(mResult);
mTextView.setText(mResult);
}
});