Skip to content

Instantly share code, notes, and snippets.

View ininmm's full-sized avatar
🎯
Focusing

ininmm

🎯
Focusing
View GitHub Profile
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.tasks_frag, container, false)
viewDataBinding = TaskdetailFragBinding.bind(view).apply {
viewmodel = viewModel
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewDataBinding = TasksFragBinding.inflate(inflater, container, false).apply {
viewmodel = viewModel
}
...
...
return viewDataBinding.root
@ininmm
ininmm / drawer_actions.xml
Last active September 13, 2019 10:06
navigation menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@id/tasksFragment"
android:icon="@drawable/ic_list"
android:title="@string/list_title"/>
<item
android:id="@id/statisticsFragment"
@ininmm
ininmm / TasksRepository.kt
Last active September 14, 2019 12:42
TasksRepository
class TasksRepository (
private val tasksRemoteDataSource: TasksDataSource,
private val tasksLocalDataSource: TasksDataSource,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : ITasksRepository {
private var cachedTasks: ConcurrentMap<String, Task>? = null
override suspend fun getTasks(forceUpdate: Boolean): Result<List<Task>> {
wrapEspressoIdlingResource {
@ininmm
ininmm / TasksLocalDataSource.kt
Last active September 14, 2019 12:48
TasksLocalDataSource
class TasksLocalDataSource @Inject constructor(
private val tasksDao: TasksDao,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : TasksDataSource {
override suspend fun getTasks(): Result<List<Task>> = withContext(ioDispatcher) {
return@withContext try {
Success(tasksDao.getTasks())
} catch (e: Exception) {
e.printStackTrace()
Error(e)
@ininmm
ininmm / ViewModel.kt
Last active September 18, 2019 01:41
同步的 ViewModel
class ViewModel {
fun getToken(): Token {
// 做一些 API 耗時操作
return token 請求 access token
}
fun verify(token, userName): Boolean {
// 做一些 API 耗時操作
return result // 登入成功或失敗
@ininmm
ininmm / ViewModel.kt
Created September 18, 2019 01:44
使用 Lambda 的 ViewModel
fun getTokenAsync(action: (Token) -> Unit) {
......
}
fun verifyAsync(
token: Token,
userName: String,
action: (Boolean) -> Unit
) {
......
@ininmm
ininmm / ViewModel.kt
Created September 18, 2019 01:56
使用 RxJava 的 ViewModel
fun getToken(): Observable<Token> { ...... }
fun verify(userName): Observable<Boolean> {
return getToken()
.flatMap { token ->
......
}
}
fun requestAndSaveUserData(userName: String): Observable<Result> {
@ininmm
ininmm / ViewModel.kt
Created September 18, 2019 01:59
使用 Coroutines 的 ViewModel
suspend fun getToken(): Token { ...... }
suspend fun verify(token, userName: String): Boolean { ...... }
suspend fun requestAndSaveUserData(userName: String): Result { ...... }
fun login(userName: String) {
GlobalScope.launch {
try {
val token = getToken()
@ininmm
ininmm / SampleCoroutineScope.kt
Created September 19, 2019 00:30
Sample CoroutineScope
class MainActivity : AppCompatActivity(), CoroutineScope {
override val coroutineContext: CoroutineContext
get() = job
val job = Job() // 默認使用預設 thread
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)