嗨,我正在尝试创建一个简单的应用程序,使用改造库来调用api进行登录,我想使用MVP模式,你们中的任何人都可以指导如何做到这一点,因为我我搜索了很多,我找到了很多不同的解决方案,所以现在我想看到你的想法:
网络-retrofit实例模型-User pojo Presenter - 从活动调用make视图 - showProgressBar(),hideProgressBar()等方法
但是我不确定这是不是一个好方法......我想检查什么时候失败,并且组织得很好。
对于Android体系结构,目前googles推荐MVVM模式而不是MVP与它的android体系结构组件(AAC)。 mvvm优于MVP的原因有很多。以下是MVP模式的一些缺点。
回调地狱
配置更改
紧夫妇的观点和主持人
MVVM模式通常更适合,并且更易于维护,因此更好的设计模式。由于以下原因,我更喜欢MVVM而不是MVP,
反应
配置变化的生存
代码示例
在改造中,我们需要获取改造客户端的实例。您应该通过singleton / dependency注入来检索实例。以下是生产项目的示例。下面的例子将在kotlin代码中,因为它很有趣。
要创建实例,(请注意,使用了JSON转换器工厂MOSHI)
Retrofit.Builder()
.baseUrl("http://google.com")
.addConverterFactory(MoshiConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(get("MockHttpClient"))
.build().create<ApiService>(ApiService::class.java)
然后,需要为您使用的api定义一个接口,注意它返回一个Flowable,它是一个Rxjava对象,类似于Observable但具有背压处理。现在只知道它是一个可观察的并将发出数据。
interface ApiService {
@FormUrlEncoded
@POST(ACCESS_TOKEN_PATH)
fun getAccessToken(
@Field("client_id") client_id: String,
@Field("client_secret") client_secret: String,
@Field("grant_type") grant_type: String
): Flowable<GetAccessToken>
}
然后在你的viewModel中,为了简单起见,我们可以直接注入这个实例/或从单例中检索它。(也可以添加一个存储库层用于从源代码中检索数据)注意,这里,实时数据用作viewmodel和viewmodel之间的连接。 view,这是一个可观察的视图,在视图的生命周期结束时将自行配置。
我们订阅api的可观察返回并从中获取数据。
class TimeSettingViewModel(val context: Application, val retrofit: Retrofit) : AndroidViewModel(context) {
private val compositeDisposable = CompositeDisposable()
val accessTokenLiveData: MutableLiveData<AccessToken> = MutableLiveData()
override fun onCleared() {
compositeDisposable.clear()
super.onCleared()
}
fun getAccessToken(){
retrofit.getAccessToken("some","thing","here")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
accessTokenLiveData.value = it
},{
it.printStackTrace()
})
}
}
稍后在您的视图(Activity / Fragment /其他基于视图的视图控制器)中,您可以在此处注入viewModel并观察其中的数据。根据该数据,您可以更新您的视图。
private fun accessTokenLiveData() {
timeSettingViewModel.accessTokenLiveData.observe(this, android.arch.lifecycle.Observer {
if (it != null) {
updateLoginView(it)
}
})
timeSettingViewModel.getAccessToken()
}