Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API 呼び出しが Main Thread になってるかも #79

Open
kokoichi206 opened this issue Oct 29, 2022 · 3 comments
Open

API 呼び出しが Main Thread になってるかも #79

kokoichi206 opened this issue Oct 29, 2022 · 3 comments

Comments

@kokoichi206
Copy link
Member

kokoichi206 commented Oct 29, 2022

ちょっと調べた感じ、以下のブロックは Main Thread で実行されてまってそう。。。

getMembersUseCase("").onEach { result ->
    when (result) {
        ...
    }
}.launchIn(viewModelScope)

// getMembersUseCase() のなかみ
class GetMembersUseCase @Inject constructor(
    private val repository: SakamichiRepository
) {
    // ここで Members -> List<Member> に変えている
    operator fun invoke(groupName: String): Flow<Resource<List<Member>>> = flow {
        try {
            emit(Resource.Loading<List<Member>>())
            val members = repository.getMembers(groupName).members.map { it.toMember() }
            emit(Resource.Success<List<Member>>(members))
        } catch (e: HttpException) {
            emit(Resource.Error<List<Member>>(e.localizedMessage ?: "An unexpected error occurred."))
        } catch (e: IOException) {
            emit(Resource.Error<List<Member>>("Couldn't reach server. Check your network connection"))
        }
    }
}

ログに出してみた結果、main って出てるけど本当?
(main だと通信できない気がしたり。。。)

2022-12-12 12:04:28.796 15141-15141 hoge                    jp.mydns.kokoichi0206.sakamichiapp   D  GetMembersUseCase: Thread[main,5,main]
2022-12-12 12:04:28.796 15141-15141 hoge                    jp.mydns.kokoichi0206.sakamichiapp   D  MembersRepositoryImpl: Thread[main,5,main]
2022-12-12 12:04:29.050 15141-15141 hoge                    jp.mydns.kokoichi0206.sakamichiapp   D  MemberListViewModel: Thread[main,5,main]

この辺を参考にして、ベストプラクティスに従っていく。

https://developer.android.com/kotlin/coroutines/coroutines-adv?hl=ja#perf

@kokoichi206
Copy link
Member Author

@kokoichi206
Copy link
Member Author

kokoichi206 commented Dec 12, 2022

確認したこと

Main Thread で呼ばれてそう

API 通信のメソッドで sleep を入れる(通信が遅い状況をイメージ)と、その間に他のタブを押しても反応しない
(『応答していません』と出てアプリが落ちる)

viewModel が死んでも、通信は終わってない

viewModel のライフサイクルで使えそうなのがある?

Screenshot 2022-12-12 at 12 22 22

onCleared()

This method will be called when this ViewModel is no longer used and will be destroyed.
It is useful when ViewModel observes some data and you need to clear this subscription
to prevent a leak of this ViewModel.

で cancel してあげたら良さそう?って思ってたけど、バックキーで戻った時はこちらは呼ばれない模様

    override fun onCleared() {
        super.onCleared()
        viewModelScope.cancel()
    }

@kokoichi206
Copy link
Member Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant