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框架)的主要内容,如果未能解决你的问题,请参考以下文章

第九讲-时间序列法

Android框架之高速开发框架xUtil

《上古天真论》第九讲文字版

Android 开源框架 ( 五 ) xUtils --- Android 里的 ORM IOC聚合型框架

xUtils3.0框架学习笔记

第九讲二次型