変数データの取り回し方でアドバイスをいただけないでしょうか?
現在、android studio で用意されたログイン用のテンプレートを元に、外部APIと連動したログイン処理を作りたいと思っています。
その中で、一部、データをどのように渡すべきか悩んでおります。
kotlinのログインテンプレート、LoginViewModel内から呼ばれる、loginRepositoryのloginメゾットから先で
class LoginViewModel(private val loginRepository: LoginRepository) : ViewModel() { private val _loginResult = MutableLiveData<LoginResult>() val loginResult: LiveData<LoginResult> = _loginResult fun login(email: String, password: String) { // can be launched in a separate asynchronous job val result = loginRepository.login(email, password) if (result is Result.Success) { _loginResult.value = LoginResult(success = LoggedInUser(userToken = result.data.displayName)) } else { _loginResult.value = LoginResult(error = R.string.login_failed) } } ....
次のように非同期のHTTP通信で得たデータ(user)を戻す最適解のアドバイスをいただけないでしょうか?
fun login(username: String, password: String): Result<LoggedInUser> { try { // TODO: handle loggedInUser authentication "http://hogehoge.jp/api/userdata".httpPost().responseObject<LoggedInUser>{ req, res, result -> val(user,err) = result } return Result.Success(user) } catch (e: Throwable) { return Result.Error(IOException("Error logging in", e)) } }
代案として同期処理での実装も試みたのですが、まず、メインスレッドでのHTTP通信が禁止との事。
ならばと、次のようにThreadで処理を切り離して、HTTP通信部分を同期処理としてみたのですが、
Thread { val result = loginRepository.login(email, password) if (result is Result.Success) { _loginResult.value = LoginResult(success = LoggedInUser(userToken = result.data.userToken)) } else { _loginResult.value = LoginResult(error = R.string.login_failed) } }
こちらは LiveData の更新がうまく拾えず稼働しませんでした。
アプローチの方法だけでもアドバイスいただけましたら、非常に助かります。
どうぞよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/24 05:06