嗨,我正在尝试创建一个简单的应用,在其中使用改造库来调用api以进行登录,并且我想使用MVP模式,你们中的任何人都可以指导如何做,因为我进行了很多搜索,发现了很多不同的解决方案,所以现在我想看看您的想法:
网络 -retrofit实例 模型 -用户pojo 主持人 -从活动中拨打电话 视图 -showProgressBar(),hideProgressBar()之类的方法
但是我不确定这是否是一种好方法。我还想检查何时失败,并组织得井井有条。
答案 0 :(得分:1)
对于android架构,目前Google推荐使用MVP及其android架构组件(AAC)来实现MVVM模式。有许多原因使mvvm优于MVP。这是MVP模式的一些弊端。
回调地狱
MVP模式将业务逻辑和视图修改分为 演示者和视图,它需要一个用于视图的界面 执行业务操作时与演示者进行交互 (例如,请求数据/上传数据)。视图需要实现这个 接口,演示者通常根据此调用方法 界面向视图提供数据。换句话说,MVP使用 数据通道的回调。
对于这些互动的每个动作,都会将一种方法添加到 接口。当互动时,它很快变得不堪重负 因为将有两种维护方法。一改 界面中的方法也会导致两者的多个更改 由于此MVP具有紧密的耦合性,所以是演讲者和视图。
配置更改
紧密的视图和演示者
MVVM模式通常更适合,并且是一种更易于维护的更好的设计模式。由于以下原因,我更喜欢MVVM而不是MVP,
反应性
MVVM是Model View ViewModel的短期名称,其中视图模型是 演示者上类似的抽象层,可为演示者提供数据 视图。当viewModel通知视图时,View观察viewModel。 这样可以确保视图始终获取最新数据。而且避免 通过仅在一个位置获取视图即可回调地狱 数据,而视图始终取决于它。
MVVM在反应模式下可以很好地工作。例如像你一样 说,改造通常用于Observable模式(例如RxJava )。改造的客户生活在viewModel中并检索数据 从可以通过视图观察的Observable对象中获取。同样可以 还可以实现数据持久性和系统服务中的数据。
有关配置更改的信息
代码示例
在改造中,我们需要获取改造客户端的一个实例。您应该通过单例/依赖注入来检索实例。这是来自生产项目的示例。以下示例将采用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中,为简单起见,我们可以直接注入该实例或从单例中检索它。(还可以添加一个存储库层以从源中检索数据)请注意,此处使用实时数据作为连接在视图模型和视图之间,这是一个可观察的视图,它将在视图的生命周期结束时自行处理。
我们从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()
})
}
}
稍后在您的视图中(活动/片段/其他基于视图的视图控制器),您可以在此处注入viewModel并观察其中的数据。根据这些数据,您可以更新视图。
private fun accessTokenLiveData() {
timeSettingViewModel.accessTokenLiveData.observe(this, android.arch.lifecycle.Observer {
if (it != null) {
updateLoginView(it)
}
})
timeSettingViewModel.getAccessToken()
}