我目前正在关注android中的mvvm和存储库体系结构教程,由于我遇到的教程代码中的抽象,有些事情我不理解。
虽然代码运行良好(编译时没有任何问题),但抽象使我很难理解如何处理改装响应。
存储库
suspend fun login(username: String, password: String) { // LiveData<List<AuthModel>> {
withContext(Dispatchers.IO) {
val auth = Network.retrofitInstance?.create(AuthService::class.java)
val i = auth?.doLoginAsync(username, password)?.await()
if (i != null) {
database.authDao.updateAuthInfo(*i.asDatabaseModel())
}
}
//return auth
}
}
接口
interface ServiceSectionDao{
@POST("login")
fun doLoginAsync(
@Query("user_id") userName: String,
@Query("password") passWord: String
): Deferred<NetworkAuthContainer>
}
改造对象
object Network {
private var retrofit: Retrofit? = null
private val BASE_URL = "http://10.0.2.2:8081/api/"
val retrofitInstance: Retrofit?
get() {
if (retrofit == null) {
var client = OkHttpClient.Builder()
.addInterceptor(RequestInterceptor())
.build()
retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.build()
}
return retrofit
}
请求拦截器
class RequestInterceptor : Interceptor {
var token = "FmQ54sSLm0H0P83EFU7fB2k9flgs5fXQNBS7EgtH";
fun Token(token: String) {
this.token = token;
}
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
if (request.header("No-Authentication") == null) {
//val token = getTokenFromSharedPreference();
//or use Token Function
if (!token.isNullOrEmpty()) {
val finalToken = "Bearer " + token
request = request.newBuilder()
.addHeader("Authorization", finalToken)
.build()
}
}
return chain.proceed(request)
}
}
我从上面的val i=auth?.dologinasync(用户名、密码)?.await()已经是networkauthcontainer,我没有机会检查任何http状态代码。
在调试期间,我可以看到改型返回的结果对象,但我无法处理它,因为我不知道应该在代码中的何处读取requestinterceptor或repository(login)上的值,以及如何读取?
1条答案
按热度按时间khbbv19g1#
代码的第一个问题是,您使用的是不推荐使用的CoroutineCalAdapterFactory,从2.6版开始,改型现在具有对kotlin挂起函数的本机支持。所以,你应该做的第一件事就是更新你的
Retrofit
依赖于最新版本。一旦你这样做了,你就可以更新你的
doLoginAsync
到现在开始
HTTP
您可以从响应中更新返回类型的状态代码doLogin
到retrofit2.Response<NetworkAuthContainer>
在您的存储库中