Skip to content

Instantly share code, notes, and snippets.

@webserveis
Last active September 3, 2019 21:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save webserveis/9d1057f93062e49b0a853a165c67ae42 to your computer and use it in GitHub Desktop.
Save webserveis/9d1057f93062e49b0a853a165c67ae42 to your computer and use it in GitHub Desktop.
Resource Design Pattern

#Patrón de diseño Resource

  • ViewModel
  • LiveData
  • Observer

Recursos

  • Resource.kt: Livedata con canala de distribución
  • MyViewModel.kt: Controlador
  • MyActivity.kt: actividad principal
class MainActivity : AppCompatActivity() {
companion object {
val TAG: String = MainActivity::class.java.simpleName
}
private val mViewModel: IpInfoViewModel by lazy {
ViewModelProviders.of(this).get(IpInfoViewModel::class.java)
}
private val changeObserver = Observer<Resource<List<String>>> { value ->
value?.also {
when (value.status) {
Resource.Status.LOADING -> {
Log.d(TAG, "Loading...." + value.data)
}
Resource.Status.SUCCESS -> {
Log.d(TAG, "Success....")
Log.d(TAG, value.data.toString())
}
Resource.Status.ERROR -> {
Log.e(TAG, "Error: ${value.exception?.exceptin}")
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
mViewModel.mResultData.observe(this, changeObserver)
}
}
class MyViewModel(application: Application) : AndroidViewModel(application) {
val mResultData = MutableLiveData<Resource<List<String>>>()
//for background task
private var isRunning: Boolean = false
private val viewModelJob = SupervisorJob()
private val uiScope = CoroutineScope(Dispatchers.Default + viewModelJob)
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}
fun runSimpleTask() {
if (!isRunning)
uiScope.launch {
Log.d(TAG, "launch DataResponse Load")
isRunning = true;
val list = mutableListOf<String>()
(1..10).forEach {
delay(500L)
mResultData.postValue(Resource.loading(listOf("${Thread.currentThread().name} generate steep:$it")))
list.add("Name $it")
}
//mResultData.postValue(Resource.error(AppException(e)))
mResultData.postValue(Resource.success(list))
isRunning = false
}
}
companion object {
val TAG: String = IpInfoViewModel::class.java.simpleName
}
}
class Resource<T> private constructor(val status: Status, val data: T?, val exception: AppException?) {
enum class Status {
SUCCESS, ERROR, LOADING
}
companion object {
fun <T> success(data: T?): Resource<T> {
return Resource(
Status.SUCCESS,
data,
null
)
}
fun <T> error(exception: AppException?): Resource<T> {
return Resource(
Status.ERROR,
null,
exception
)
}
fun <T> loading(data: T?): Resource<T> {
return Resource(
Status.LOADING,
data,
null
)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment