Giter Site home page Giter Site logo

paging-coroutine's Introduction

Paging-Coroutine

A paging library which uses Kotlin Coroutine instead of background executor and callback, based on androidx.paging (Ver: 2.1.0) architucture component.

Usage

Dependencies

The paging-coroutine library is avaible on JitPack. Add the JitPack maven repository to the root build.gradle file.

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

Add the following dependency to the project build.gradle file.

dependencies {
	implementation 'com.github.mirmilad:paging-coroutine:v1.0.0-alpha01'
}

This library also needs these dependencies.

dependencies {
	implementation "androidx.lifecycle:lifecycle-livedata:2.2.0-rc02"			//or above
	implementation "androidx.paging:paging-runtime:2.1.0"						//or above
}

How to Use

The paging-coroutine library behaves like the original paging library. But there are few modifications on classes name and abstract methods. When you extend a data source, instead of using callbacks to pass data to library, you have to return it.

The following instructions and samples shows how to use paging-coroutine library.

DataSource Implementation

There are different data source classes exactly like the original library data source classes which named with Coroutine prefix.

All of the suspend methods in data source class run on Default dispatcher. If you need to use another dispatcher, you can use coroutineScope property of data source.

For example, extend your data source class from CoroutinePageKeyedDataSource class and implement the required methods like below:

class MyDataSource(api: ApiInterface)
				: CoroutinePageKeyedDataSource<Int, MyModel>()
{
	override suspend fun loadInitial(params: LoadInitialParams<Int>)
				: InitialResult<Int, MovieModel> {
		try {
			//sample using of a suspend method
			val result = api.suspendGetList(...)	//blocks current Coroutine till response comes
			return InitialResult.Success(result)
		} catch (e: Exception) {
			//you should notify user
			return InitialResult.Error(e)
		}
	}
	
	override suspend fun loadBefore(params: LoadParams<Int>)
				:CoroutinePageKeyedDataSource.LoadResult<Int, MyModel> {
		//No Data
		return InitialResult.None
	}
	
	override suspend fun loadAfter(params: LoadParams<Int>)
				: CoroutinePageKeyedDataSource.LoadResult<Int, MyModel> {
		//sample of using none suspend method in IO dispatcher
		lateinit var retVal: LoadResult<Int, MyModel>;
		this.coroutineScope.launch(Dispatchers.IO) {
			try {
				val result = api.getList(...).execute()
				retVal = LoadResult.Success(result)
			} catch (e: Exception) {
				//you should notify user
				retVal = LoadResult.Error(e)
			}
		}.join()
		return retVal
	}
}

DataSource.Factory Implementation

Extend your data source factory class from CoroutineDataSource.Factory class and implement create method to return a data source.

class MyDataSourceFactory(private val api: ApiInterface)
				: CoroutineDataSource.Factory<Int, MyModel>() {
	val sourceLiveData = MutableLiveData<MyDataSource>()
	override fun create(): DataSource<Int, MyModel> {
		val source = MyDataSource(api)
		sourceLiveData.postValue(source)
		return source
	}
}

LiveData

In order to configure and creating a LiveData, you have to call CoroutineDataSource.Factory.toCoroutineLiveData method. The following code snippet shows how to use this method.

val dataSourceFactory = MyDataSourceFactory(api)
val liveData = dataSourceFactory.toCoroutineLiveData(pageSize = 10)

Lifecycle handling

When you don't need resources and data any more you should release them. By calling CoroutineDataSource.cancelCouroutines() method, all runing coroutines related to this data source will cancel immediately.

If you are using ViewModel you have to call this method inside of onCleared. The following code snippet is an example that shows how to use this method.

class MyViewModel() : ViewModel() {
	private val dataSourceFactory = MyDataSourceFactory(api)
	val liveData = dataSourceFactory.toCoroutineLiveData(pageSize = 10)

	override fun onCleared() {
		super.onCleared()
		dataSourceFactory.sourceLiveData?.value?.cancelCoroutines()
	}
}

Sample Project

For more samples, see the modified version of PagingWithNetworkSample project here. This Sample app was forked from official architecture-components-samples repository and has been modified to use paging-coroutine library.

Compatibility

Since DataSource and PagedList classes are used from origianl library, paging-coroutine library is compatible with PagedListAdapter.

Since PagedList class needs an executor as notifyExecutor, paging-coroutine library still uses MainThreadExecutor.

To Do List

  • Writing more tests and coverages
  • Removing MainThreadExecutor

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.