#Patrón de diseño Resource
- ViewModel
- LiveData
- Observer
- 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 | |
) | |
} | |
} | |
} |