通过改造登录MVP

问题描述 投票:-1回答:1

嗨,我正在尝试创建一个简单的应用程序,使用改造库来调用api进行登录,我想使用MVP模式,你们中的任何人都可以指导如何做到这一点,因为我我搜索了很多,我找到了很多不同的解决方案,所以现在我想看到你的想法:

网络-retrofit实例模型-User pojo Presenter - 从活动调用make视图 - showProgressBar(),hideProgressBar()等方法

但是我不确定这是不是一个好方法......我想检查什么时候失败,并且组织得很好。

java android mvp android-mvp
1个回答
1
投票

对于Android体系结构,目前googles推荐MVVM模式而不是MVP与它的android体系结构组件(AAC)。 mvvm优于MVP的原因有很多。以下是MVP模式的一些缺点。

回调地狱

  • MVP模式将业务逻辑和视图修改分离为Presenter和View,并且在执行业务操作时(例如,请求数据/上载数据),它需要视图的界面与演示者交互。视图需要实现此接口,并且演示者通常根据此接口调用方法以向视图提供数据。换句话说,MVP使用数据通道的回调。 对于这些交互的每个操作,将一个方法添加到接口。当交互很快就会变得势不可挡,因为有两种方法需要维护。由于该MVP的紧密耦合特性,界面中方法的一个改变还导致演示者和视图中的多个改变。

配置更改

  • 当配置发生变化时,MVP不能解决这个问题(例如,显示指标变化,屏幕旋转等)。在您明确处理视图状态之前,视图状态不会保留。

紧夫妇的观点和主持人

  • 如上所述,在MVP中,视图和演示者紧密耦合,在添加方法,更改方法签名时,维护将是痛苦的。

MVVM模式通常更适合,并且更易于维护,因此更好的设计模式。由于以下原因,我更喜欢MVVM而不是MVP,

反应

  • MVVM是Model View ViewModel的短期内容,其中视图模型是一个类似于presenter的抽象层,它为视图提供数据。当viewModel通知视图时,View会观察viewModel。它确保视图始终获取最新数据。并且它通过只有一个视图可以获取数据的位置来避免回调,并且视图总是依赖于它。 MVVM非常适用于反应模式。例如,就像你说的那样,改造通常与MVVM中的Observable模式(如RxJava)一起使用。改造客户端存在于viewModel中,并从Observable对象中检索可由视图观察的数据。对于数据持久性和来自系统服务的数据也可以做同样的事情。

配置变化的生存

  • ViewModel通过使视图模型超出视图的生命周期而幸免于配置更改。在AAC的viewModel实现中,它就是这样做的。更改配置后,视图始终可以从viewModel检索状态,从而提供更好的UX。

代码示例

在改造中,我们需要获取改造客户端的实例。您应该通过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()
    }
© www.soinside.com 2019 - 2024. All rights reserved.