网络通信与数据存储 | 青训营笔记

93 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第4天。

以下是第四堂课的笔记和总结

数据存储&网络通信

网络通信

网络库开源框架
  • HttpURLConnection
  • Volley
  • OkHttp
  • Retrofit
Retrofit介绍

目前最热门的网络请求封装框架,是对OkHttp的一个封装。

  • 使用步骤

    1. Retrofit库引入

      添加依赖dependencies

    2. 创建描述网络请求的接口

      interface IUserInfoService{ // 接口类名,如用户信息
          
      	@GET("")// @Get注解,表示使用get请求,里面是相对路径
          fun getUserName(@Path("") uid: Int):Call<ResponseBody>;// 接口具体函数,如获取用户姓名
            // @Path参数注解,可以将形如{uid}的参数进行替换
            // Call<ResponseBody>将返回值string自动转换为Model类
      }
      
    3. 使用Retrofit实例发起网络请求

      • 创建Retrofit实例

        val retrofit = Retrofit.Builder()
            .baseUrl("") // 设置网络请求URL地址
            .build();
        
      • 创建请求接口实例,并获取Call实例

        val iUserInfoService = retrofit.create(IUserInfoService::class.java);
        val call = iUserInfoService.getUserName("id");
        
      • 调用call.enqueue进行异步请求

        call.enqueue(object : Callback<ResponseBody>) {
            
            override fun onResponse(call Call<ResponseBody>, response: Response<ResponseBody>); 
            // 请求成功时回调,可以对返回数据进行处理
            
            override fun onFailure(call Call<ResponseBody>, e: Throwable);
            // 请求失败时回调,print报错信息
        };
        
TTNET介绍

字节跳动内部使用的网络封装库,是基于Retrofit进行二次开发,将底层实现的OkHttp替换为Cronet,用法与Retrofit基本一致。

数据存储

数据储存方式对比
  • SharePreferences

    特点:只能存boolean,int,float,long,String五种简单类型,使用键值对存储。

    使用场景:记录app的各种配置信息,如用户切换的开关等。

  • 文件存储

    特点:可以将各种格式的文件存到手机中,一般不能跨app共享。

    使用场景:网络下载的zip包,txt文件的存储。

  • ContentProvider

    特点:可跨app共享,通过Uri对象访问。

    使用场景:音频、视频、图片、通信录的读写。

  • SQLite存储数据

    特点:可存储结构化数据,增删查改方便。

    使用场景:保存feed流数据,并增删查改。

数据库框架
  • Room(包增量小,使用成本高,但支持功能最多)
  • GreenDao
  • ObjectBox(包增量最大,综合性能最好,但支持功能少)
Room数据库使用介绍
  • 添加依赖dependencies

  • 新建Entity

    @Entity
    data class User(
        @PrimaryKey(autoGenerate = true) val id: Int?, 
        // 表示主键,当主键为null且autoGenerate为true时,可自动生成
        @ColunmnInfo(name = "") val xxx: String?,
        // 列名注解
    )
    
  • 新增Dao

    @Dao
    interface UserDao{
        @Query("SELECT * FROM user") // 查询
        fun getAll(): List<User>?;
        
        @Query("SELECT * FROM user WHERE id IN (:ids)") // 指定查询
        fun loadAllByIds(userIds: IntArray): List<User>?;
        
        @Insert // 增加
        fun insertAll(vararg users: User);
        
        @Delete // 删除
        fun delete(user: User)
         
    }
    
  • 新建数据库类,进行数据库配置,并满足以下条件

    • 新建RoomDatabase的abstract子类
    • 子类注解@Database(entities = [xxx], version = n),entities包含数据实体,version是数据版本号
    • 对于每一个数据库关联的DAO类,数据库都必须定义一个无参的抽象方法,并返回DAO类实例
    @Database(entities = [User::class], version = 1)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao;
    } 
    
  • 获取dao对象

    val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "database-name")
        .build();
    userDao = db.userDao();
    

    即可进行增删查改

Room数据库原理(略)
  • 编译阶段,通过kapt处理@Dao、@Database注解,动态生成对应的实现类
  • 底层使用Android提高的SupportSQLiteOpenHelper实现数据库的增删改查

总结

本堂课学习了Android网络通信与数据存储方面的知识,主要学习了主流的Retrofit网络封装框库和Room数据库存储的基本使用。通过这节课的学习,我学到了如何能够使app向网络接口实时请求数据,获取信息流数据,并储存在本地进行长期保存。这两个知识点对我的水平有很大的提升,比如从开发单机应用变成了开发联网应用,再也不用每次打开app都不能保存之前的数据等,是相当重要的一课。