android 请求大量数据处理,Android大量数据加载—Paging的使用

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

Paging主要是用来结合RecyclerView进行使用的。它的作用是能够逐渐地、优雅地加载所需要加载的数据。也就是一种分页方案。

Paging每次只会加载总数据的一小部分。因此它有下面的两个优点:数据加载要求更小的带宽以及更少的系统资源。

在资源发生改变的情况下,app依然能够很快的做出响应。

PagedList

这个类是用来存储加载的数据。PagedList中所需要的数据都是从下面要讲的DataSource中进行加载的。

DataSource

DataSource顾名思义就是数据来源。这类提供加载所需的数据。也就是在这个类中进行数据的获取操作。数据源可以是DataBase也可以是服务器。

DataSource的三个子类:PositionalDataSource: 主要用于加载数据可数有限的数据。比如加载本地数据库,这种情况下用户可以通过比如说像通讯录按姓的首字母查询的情况。能够跳转到任意的位置。

ItemKeyedDataSource:主要用于加载逐渐增加的数据。比如说网络请求的数据随着不断的请求得到的数据越来越多。然后它适用的情况就是通过N-1item的数据来获取Nitem数据的情况。比如说Github的api。

PageKeyedDataSource:这个和ItemKeyedDataSource有些相似,都是针对那种不断增加的数据。这里网络请求得到数据是分页的。比如说知乎日报的news的api。

DataSource.Factory

这个接口的实现类主要是用来获取的DataSource的。

PagedListAdapter

这个Adapter继承自RecyclerView.Adapter。如果要使用Paging,就需要让实现的RecyclerView的Adapter继承自PagedListAdapter。这个抽象类实现关于PagedList相关的东西。

LivePagedListBuilder

通过这个类来生成对应的PagedList。

准备

// RxJavaimplementation "io.reactivex.rxjava2:rxjava:2.2.2"

implementation "io.reactivex.rxjava2:rxandroid:2.1.0"

// Retrofitimplementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0"

implementation "com.squareup.retrofit2:converter-gson:2.4.0"

implementation "com.squareup.retrofit2:retrofit:2.4.0"

// ViewModel and LiveDatadef lifecycle_version = "1.1.1"

implementation "android.arch.lifecycle:extensions:$lifecycle_version"

kapt "android.arch.lifecycle:compiler:$lifecycle_version"

// Roomdef room_version = "1.1.1"

implementation "android.arch.persistence.room:runtime:$room_version"

kapt "android.arch.persistence.room:compiler:$room_version"

implementation "android.arch.persistence.room:rxjava2:$room_version"

// Pagingdef paging_version = "1.0.0"

implementation "android.arch.paging:runtime:$paging_version"

// Glideimplementation "com.github.bumptech.glide:glide:4.8.0"

kapt 'com.github.bumptech.glide:compiler:4.8.0'

应该大家都清楚这些库吧。这里就不一一解释了。这里进行举例说明会用到Room、ViewModel、LiveData,请还不了解的朋友去看我的另外几篇博客。

PositionalDataSource的使用

数据库部分

@Entity

data class Person(@PrimaryKey(autoGenerate = true) val id: Int, val name: String)

@Dao

interface PersonDao {

@Insert

fun insertPerson(person: Person)

@Insert

fun insertPersons(persons: List)

@Delete

fun deletePerson(person: Person)

@Query("SELECT * FROM Person ORDER BY name COLLATE NOCASE ASC")

fun getAllPersons(): DataSource.Factory

}

关于Dao这里需要解释一下。getAllPersons返回一个DataSource.Factory。在之后会通过LivePagedListBuilder来构建PagedList。

@Database(entities = [Person::class], version = 1)

abstract class PersonDatabase : RoomDatabase() {

abstract fun personDao(): PersonDao

companion object {

private var INSTANCE: PersonDatabase? = null

fun get(context: Context): PersonDatabase {

if (INSTANCE == null) {

INSTANCE = Room.databaseBuilder(context, PersonDatabase::class.java,

"PersonDatabase")

.addCallback(object :RoomDatabase.Callback() {

override fun onCreate(db: SupportSQLiteDatabase) {

fillDatabase(context)

}

})

.build()

}

return INSTANCE!!

}

private fun fillDatabase(context: Context) {

ioThread {

CHEESE_DATA.map {

get(context).personDao().insertPerson(Person(0, it))

}

}

}

}

}

private val EXECUTOR = Executors.newSingleThreadExecutor()

fun ioThread(f: () -> Unit) {

EXECUTOR.execute(f)

}

private val CHEESE_DATA = arrayListOf(

"Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",

"Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale",

"Aisy Cendre", "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",

"Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell",

"Aragon", "Ardi Gasna", "Ardrahan", "Armenian String", "Aromes au Gene de Marc",

"Asadero", "Asiago", "Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss",

"Babybel", "Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal", "Banon",

"Barry's Bay Cheddar", "Basing", "Basket Cheese", "Bath Cheese", "Bavarian Bergkase",

"Baylough", "Beaufort", "Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",

"Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir", "Bierkase", "Bishop Kennedy",

"Blarney", "Bleu d'Auvergne", "Bleu de Gex", "Bleu de Laqueuille",

"Bleu de Septmoncel", "Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",

"Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini", "Bocconcini (Australian)",

"Boeren Leidenkaas", "Bonchester", "Bosworth", "Bougon", "Boule Du Roves",

"Boulette d'Avesnes", "Boursault", "Boursin", "Bouyssou", "Bra", "Braudostur",

"Breakfast Cheese", "Brebis du Lavort", "Brebis du Lochois", "Brebis du Puyfaucon",

"Bresse Bleu", "Brick", "Brie", "Brie de Meaux", "Brie de Melun", "Brillat-Savarin",

"Brin", "Brin d' Amour", "Brin d'Amour", "Brinza (Burduf Brinza)",

"Briquette de Brebis", "Briquette du Forez", "Broccio", "Broccio Demi-Affine",

"Brousse du Rove", "Bruder Basil", "Brusselae Kaas (Fromage de Bruxelles)", "Bryndza",

"Buchette d'Anjou", "Buffalo", "Burgos", "Butte", "Butterkase", "Button (Innes)",

"Buxton Blue", "Cabecou", "Caboc", "Cabrales", "Cachaille", "Caciocavallo", "Caciotta",

"Caerphilly", "Cairnsmore", "Calenzana", "Cambazola", "Camembert de Normandie",

"Canadian Cheddar", "Canestrato", "Cantal", "Caprice des Dieux", "Capricorn Goat",

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值