进行改造后登录MVP

时间:2018-08-24 07:19:00

标签: java android mvp android-mvp

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

网络   -retrofit实例 模型  -用户pojo 主持人  -从活动中拨打电话 视图  -showProgressBar(),hideProgressBar()之类的方法

但是我不确定这是否是一种好方法。我还想检查何时失败,并组织得井井有条。

1 个答案:

答案 0 :(得分:1)

对于android架构,目前Google推荐使用MVP及其android架构组件(AAC)来实现MVVM模式。有许多原因使mvvm优于MVP。这是MVP模式的一些弊端。

回调地狱

  • MVP模式将业务逻辑和视图修改分为 演示者和视图,它需要一个用于视图的界面 执行业务操作时与演示者进行交互 (例如,请求数据/上传数据)。视图需要实现这个 接口,演示者通常根据此调用方法 界面向视图提供数据。换句话说,MVP使用 数据通道的回调。

    对于这些互动的每个动作,都会将一种方法添加到 接口。当互动时,它很快变得不堪重负 因为将有两种维护方法。一改 界面中的方法也会导致两者的多个更改 由于此MVP具有紧密的耦合性,所以是演讲者和视图。

配置更改

  • 当配置发生更改时,MVP无法解决此问题 (例如,显示指标更改,屏幕旋转等)。查看状态 除非您明确处理,否则将不会保留。

紧密的视图和演示者

  • 如前所述,在MVP中,视图和演示者紧密相连, 在添加方法时,维护会很麻烦 更改方法签名。

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

反应性

  • MVVM是Model View ViewModel的短期名称,其中视图模型是 演示者上类似的抽象层,可为演示者提供数据 视图。当viewModel通知视图时,View观察viewModel。 这样可以确保视图始终获取最新数据。而且避免 通过仅在一个位置获取视图即可回调地狱 数据,而视图始终取决于它。

    MVVM在反应模式下可以很好地工作。例如像你一样 说,改造通常用于Observable模式(例如RxJava )。改造的客户生活在viewModel中并检索数据 从可以通过视图观察的Observable对象中获取。同样可以 还可以实现数据持久性和系统服务中的数据。

有关配置更改的信息

  • ViewModel通过使视图模型超过 视图的寿命。在viewModel的实现中 AAC,正是这样做的。更改配置后,视图可以 总是从viewModel检索状态,这提供了很多 更好的用户体验。

代码示例

在改造中,我们需要获取改造客户端的一个实例。您应该通过单例/依赖注入来检索实例。这是来自生产项目的示例。以下示例将采用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()
    }