Android第九讲笔记(xUtils框架,Gson框架)
Posted a碟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android第九讲笔记(xUtils框架,Gson框架)相关的知识,希望对你有一定的参考价值。
目录
1.xUtils框架
1.背景
在上一讲,我们学习了原生HTTP访问
原生HTTP访问的缺点:
可以看到,这样网络访问有几个缺点
- 需要自己创建一个线程,在这个线程中进行网络请求
- 如果要进行UI操作还要切回主线程执行
- 对于异常的处理,需要自己手写
而xUtils框架将上述几个问题封装起来,这样我们直接使用就会变得很简单,让使用者感到方便。
2.xUtils简介
官网
xUtils 包含了orm, http(s), image, view注解, 但依然很轻量级(251K), 并且特性强大, 方便扩展.
功能简介
3.xUtils框架使用方法
1.准备工作
首先要添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
如需要访问http请求,则需要添加下面红色方框里面的代码
2.导入依赖
implementation 'org.xutils:xutils:3.8.5'
3.添加以下代码
x.Ext.init(getApplication());
RequestParams requestParams = new RequestParams("http://148.70.46.9/object");//访问的请求地址
x.http().get(requestParams, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
4.简单案例
package com.hnucm.android_0507;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView.findViewById(R.id.textview);
x.Ext.init(getApplication());
RequestParams requestParams = new RequestParams("http://148.70.46.9/object");
x.http().get(requestParams, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Log.i("MainActivity","result"+result);
//主线程
textView.setText(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Log.i("MainActivity","ex"+ex.getMessage());
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
}
可以看到
- 框架帮助我们完成了启动子线程的操作,所以不需要我们在进行网络请求的时候自己创建启动子线程
- 而且拿到数据以后不需要手动切回主线程,使用框架会帮我们切回主线程
- 对于异常,框架也会帮助我们自动处理
这个框架的初步了解就到此结束了。
其实这个框架还有很多好用的地方,注解开发等等…待补
2.Gson框架
json解析有时候很复杂。而Gson框架就简化了我们的解析操作.
Gson框架可以直接将json解析为java的实体类,方便用户操作
但是要注意,java类中的属性要和json中的键值一一对应。
1.导入依赖
implementation 'com.google.code.gson:gson:2.8.6'
以下案例都在上一个xUtils框架的基础上修改
2.案例一(简单json数据解析):
根据json的键值创建对应的java类的属性。这里就不贴java类了。
package com.hnucm.android_0507;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.google.gson.Gson;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.textview);
x.Ext.init(getApplication());
RequestParams requestParams = new RequestParams("http://148.70.46.9/object");
// Retrofit RxJava
x.http().get(requestParams, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Log.i("MainActivity","result"+result);
Gson gson=new Gson();
Student student = gson.fromJson(result, Student.class);
//主线程
textView.setText(student.name);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Log.i("MainActivity","ex"+ex.getMessage());
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
}
结果图
3.案例二(json嵌套json数据解析)
主要需要更改Student类
因为在本案例的接收到的json对象中中的的其中一个键值是"class"
而"class"是java的关键字
@SerializedName这个注解作用:属性重命名,可以将json中的属性名转为我们自己自定义的属性名
就可以将下面定义的属性名改为class而不冲突
package com.hnucm.android_0507;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.google.gson.Gson;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.textview);
x.Ext.init(getApplication());
RequestParams requestParams = new RequestParams("http://148.70.46.9/object1");
// Retrofit RxJava
x.http().get(requestParams, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Log.i("MainActivity","result"+result);
Gson gson=new Gson();
Student student = gson.fromJson(result, Student.class);
//主线程
textView.setText(student.name+student.class1.classname);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Log.i("MainActivity","ex"+ex.getMessage());
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
}
4.案例三
同样要更改Student类
package com.hnucm.android_0507;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.google.gson.Gson;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.textview);
x.Ext.init(getApplication());
RequestParams requestParams = new RequestParams("http://148.70.46.9/object3");
// Retrofit RxJava
x.http().get(requestParams, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Log.i("MainActivity","result"+result);
Gson gson=new Gson();
Student student = gson.fromJson(result, Student.class);
//主线程
textView.setText(student.classname);
for(Student.MyClass myClass:student.students){
Log.i("MainActivity","result:"+myClass.name);
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Log.i("MainActivity","ex"+ex.getMessage());
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
}
5.使用GsonFormat
GsonFormat插件可以根据我们给出的json对象数据来一键生成java类,避免了使用者可能因为打错java类的属性名而接收不到json中的数据问题。
点击右键选择Generate,点击GsonFormatPlus
第一次使用可以设置一下
即可自动生成
补充
1.学会打断点
当出现问题的时候学会打断点进行查错,点击爬虫进行单步运行
当我们运行到这句话时,我们发现student的classname1属性是空的,可以发现问题应该是出现在这里。从而进行排查。
2.构造接口的平台
https://www.fastmock.site
在很多的项目中,我们需要获得很多的数据,可以本地获取,也可以通过网络接口来获取。而这一个平台提供给了我们创建自己的接口并且写入JSON数据的方法。
操作很简单,大家可以自己去试试。
3.图床的使用
图床是什么呢,图床可以将本地的图片上传至服务器,针对每个图片提供一个唯一的url,借助这个url就可以将图片展示到其他网页上。
我使用了一个免费的图床有一段时间了,个人感觉还不错
遇见图床
将自己本地的图片上传之后,就能拿到url了。
听说还可以自己搭建图床,待补。
4.整合网络请求和列表的案例
先放个演示
过几天有时间源码放在github上可供大家参考,批评指正。
以上是关于Android第九讲笔记(xUtils框架,Gson框架)的主要内容,如果未能解决你的问题,请参考以下文章