标签: android-mvp

Content Provider是Repository Pattern的实现吗?

存储库模式Hieatt和Rob Mee定义为设计模式,模式使用类似集合的接口来访问域对象,从而在域和数据映射层之间进行调解.

MSDN存储库模式

基本上,它将一个或多个I/O设备(云,磁盘,数据库等)抽象为一个类似于集合的接口,您可以在其中读取,写入,查找和删除数据.

Fernando Cejas的Android清洁架构中,应用程序所需的所有数据都来自此层,通过存储库实现(接口位于域层中),该实现使用存储库模式,其策略通过工厂选择不同的数据源,具体取决于一定条件下.

内容提供商

然而,正如Douglas Schmidt教授在Coursera课程中所指出的,内容提供商管理和调解对一个或多个应用程序的中央数据库的访问.

内容提供商

Android编程一书中,内容提供程序用作RESTful Web服务的Facade.这种方法最初由 Virgil Dobjanschi在Google I/O 2010期间提出.

因此,为什么不使用它作为存储库模式本身而不是使用内容提供程序来访问本地SQLite数据库

在此输入图像描述

android design-patterns android-mvp

36
推荐指数
4
解决办法
2975
查看次数

我可以在Fragment中注册MVP Presenter吗?

我一直在关注Google提供的MVP设计模式 来重构我的应用程序.我有一个MainActivity和许多片段,我为每个片段创建活动似乎很麻烦,所以我一直在考虑在片段中注册演示者.我所看到的是每个片段都注册了它自己的演示者,但我不确定它有多大的错误...... :)

所以这是我的演示者:

public class FirstPresenter implements FirstContract.Presenter {
    private final FirstContract.View mView;

    public FirstPresenter(FirstContract.View view) {
        mView = view;
    }

    @Override
    public void start() {
        Log.e(TAG, "Start");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的片段:

public class FirstFragment extends Fragment implements FirstContract.View {
    private FirstContract.Presenter mPresenter;

@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container
            , Bundle savedInstanceState) {
...
// I register firstFragment's presenter here.
mPresenter = new FirstPresenter(this);
...
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这是正确的方法吗?我可以在活动中将Presenter注册到Fragment中吗?如果不是正确的方法,是否有一些很好的例子来处理一个活动和多个片段的MVP?

谢谢你们,BR!

mvp android android-fragments android-activity android-mvp

12
推荐指数
1
解决办法
1万
查看次数

Android服务应该在MVP模式中扮演什么角色?

我正在开发一个人类活动识别的Android应用程序.

它基本上就是这样 - 服务不断读取加速器数据并将识别的活动(即步行,运行)存储在数据库中.用户可以在活动中查看所有已识别的活动ListView(访问数据库).数据库中的每个User表都有一个pa_goal(物理活动目标)字段,服务从数据库中读取该字段并进行一些检查.

当然,用户可以从活动中更改此目标.因为我将实现MVP架构模式.

我不确定在哪里提供服务?肯定不是View.有什么建议?

android android-service android-mvp

10
推荐指数
1
解决办法
4257
查看次数

恢复ViewPager片段(MVP)的演示者

我正在尝试重构现有的应用程序以使用MVP架构.其中一项活动有ViewPager三个片段.每个片段都与演示者链接.确切地说 - 每个演示者在创建时都会被赋予一个View工作,即a Fragment.现在,我正在这个ViewPager适配器中创建这些演示者- 特别是在getItem(int position)方法中.

Fragment fragment = FirstFragment.newInstance();
FirstPresenter presenter = new FirstPresenter(repo, (FirstContract.View) fragment, projectId, userId);
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,如果进程被杀死然后重新启动,ViewPager它有自己的生命周期,因此getItem不再被调用 - 片段会自动重建,没有演示者.

这个问题有一个已知的解决方案吗?

mvp android android-mvp

10
推荐指数
1
解决办法
1938
查看次数

干净的架构.演示者的工作是什么?

我一直在阅读一些关于干净架构的文章,以及它如何在android中实现.我看到了显示其Android实现的示例应用程序.另外,我在Android上对Clean架构进行了很好的讨论

所以,我对大多数概念都有所了解,但我希望能够对某些事情有所了解.

根据我的理解,

  • View层是处理UI和框架相关内容的外层
  • 演示者是视图的直接通信器,它接受用户输入,并通过将其传递给用例层或交互器层来执行基于此的某些用例.
  • Interactor执行用例,将其返回给演示者发送的回调,
  • Presenter再次将此结果转换为视图可理解的数据结构(ViewModel),并将其传递回视图.

我没有列出关于内层如存储库的更多细节,因为我的问题与上述步骤有关

在这里,演示者是否只能充当UseCases和UI之间的中介,作为数据调度员?

是否仅使用视图模型来使用案例模型转换,反之亦然?

输入验证逻辑依赖于哪一层?可以在演示者里面吗?例如,如果我们采用注册过程的小用例,

一旦用户输入了详细信息并单击了注册按钮,并将数据发送给演示者,就好了

  • 如果有任何错误通知视图,Presenter将验证输入值
  • 如果值正确,则将其转换为用例模型,并执行某个用例,一旦交互器给出结果,再次转换为视图模型,将其发送到视图.

第二个问题是,谁控制导航?View或Presenter或UseCase?

谁决定下一步去哪儿?

例如 - 考虑登录过程的用例,用户将在其中输入凭据并单击"确定".

成功登录后,

  • 如果未验证用户电子邮件,请转到电子邮件验证屏幕
  • 如果用户配置文件未完成,请设置配置文件,然后仅转到主屏幕
  • 如果用户是新用户,则显示新的优惠屏幕,否则直接转到主屏幕

那么,谁负责在接下来的哪个屏幕上做出这些决定?它是演示者,它相应地决定和导航视图吗?或者是用例处理程序有责任告知演示者下一个状态是什么?

很抱歉提出这个问题的时间太长了,但我只是想详细说明我目前的理解.提前致谢

android design-patterns clean-architecture android-mvp

9
推荐指数
1
解决办法
1713
查看次数

MVP 架构模式中的实时数据

我有一个具有 MVP 架构模式的应用程序。现在,我正在尝试在我的应用程序中实现 Livedata。我搜索了很多,但找不到任何教程或示例。所有教程都说实时数据适用于 MVVM 模式。

在 MVP 模式中应用 Livedata 是一种正确的方法吗?

如果有人有关于在 MVP 中实现 Livedata 的想法,请分享。

提前致谢。

mvp android android-mvp android-livedata

9
推荐指数
1
解决办法
1969
查看次数

有关Android体系结构组件中每个组件的责任的问题

我使用MVP已有很长时间了,我开始转移到MVP和MVVM之间的混合状态

详细地,我的应用程序将如下所示:

  • 每个活动都有一个0到x个代表其视图的片段
  • 每个片段都将请求活动的ViewModel,以便他们可以使用LiveData检索数据
  • 该活动将有一个单独的ViewModel,它将充当演示者。创建后,将向ViewModel注入带有LiveData的Activity的ViewModel,以便可以根据需要更新UI
  • 演示者将获取发送到数据ViewModel的消息,并将结果发送回给它。

我的问题:

  1. 可以在演示者ViewModel中保留对数据ViewModel的引用会导致内存泄漏或诸如内存泄漏之类的不利影响吗?
  2. 业务逻辑应该在哪里?在演示者中还是在模型部分中?

例如,假设我有一个项目列表,而用户长按一个项目列表,则该体系结构的哪一部分应负责检查用户是否有权执行此操作,并让他们编辑该项目或显示错误信息?

  1. 片段是否有办法仅获得Activity的ViewModel的一部分?

例如,假设活动下面有3个片段,而一个ViewModel可以满足这些片段

我可以使用类似:

class MainViewModel : ViewModel() , IFragmentA, IFragmentB, IFragmentC
Run Code Online (Sandbox Code Playgroud)

然后,当我尝试在片段中获取ViewModel时,我可以编写如下内容:

lateinit var viewModel: IFragmentA

override fun onAttach(context: Context?) {
    super.onAttach(context)
    vm = ViewModelProviders.of(context as AppCompatActivity).get(IFragmentA::class.java)
}
Run Code Online (Sandbox Code Playgroud)

注意:我知道上面的代码不起作用,我要问的是是否有办法解决类似问题

  1. 将消息发送回活动SingleEvents的正确方法是吗?

例如,如果用户尝试删除条目,而我希望他们输入密码,则流程为:

  • Fragment发送消息以将其删除到其ViewModel
  • ViewModel将其传递给Presenter
  • 演示者决定继续进行操作之前需要密码验证
  • 演示者在ViewModel中设置SingleEvent的值
  • ViewModel通知事件的订阅者(在本例中为MainActivity)他们应该显示一个对话框,要求输入密码

感谢您提供任何帮助

android android-mvvm android-mvp android-architecture-components

8
推荐指数
1
解决办法
273
查看次数

如何以MVP模式将上下文传递到存储库

我一直在学习和整合MVP pattern,很少有问题。

我从这张图中了解到的是

活动将创建的实例Presenter,并将其引用和model对象传递给演示者

MainPresenter mainPresenter = new MainPresenter(this, new MainModel());
Run Code Online (Sandbox Code Playgroud)

接下来,如果演示者需要从本地首选项或远程存储或获取任何数据,它将询问模型。

然后模型将询问存储库以存储和检索数据。

在此处输入图片说明

我遵循了一些教程,这就是我实现模式的方式。

接口

public interface MainActivityMVP {

    public interface Model{

    }

    public interface View{
        boolean isPnTokenRegistered();
    }

    public interface Presenter{

    }
}
Run Code Online (Sandbox Code Playgroud)

活动

MainPresenter mainPresenter = new MainPresenter(this, new MainModel());
mainPresenter.sendDataToServer();
Run Code Online (Sandbox Code Playgroud)

主持人

public void sendDataToServer() {

    //  Here i need to ask `model` to check 
        do network operation and save data in preference
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是我需要访问上下文sharedPreference,但是我没有经过context任何地方。我也不想使用static context。我想知道将上下文传递到MVP模式的正确方法。

performance android android-layout android-fragments android-mvp

6
推荐指数
1
解决办法
1434
查看次数

Android 为什么要使用 MVP 模式的接口?

我第一次使用MVP模式使用Kotlin制作Android应用程序。我的问题是,既然Kotlin提供了高阶函数,为什么还需要 View 和 Presenter 的接口?我们不能只使用那些高阶函数进行通信吗?使用没有接口的模式是不是很糟糕?

我已经查看并阅读了很多文章和教程,但没有回答我的问题。我在下面的代码中所做的事情是错误的做法吗?有人可以向我解释一下吗?

在我的活动中

override fun init() {

    btn_login.setOnClickListener {
        LoginPresenter.userLogin(et_emailAddress.text.toString(),et_password.text.toString()){
            if (it){
                //do something
            }else{
                //do something
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的演讲者

object LoginPresenter {

fun userLogin(emailId: String, password: String, completion: (Boolean) -> Unit) {
    //do something
    completion(true)
 }
}
Run Code Online (Sandbox Code Playgroud)

android design-patterns kotlin android-mvp

6
推荐指数
1
解决办法
1280
查看次数

java.lang.IllegalStateException:FragmentManager尚未附加到主机

我正在使用 MVP 并创建了一个回调,该回调在登录屏幕中按下按钮时执行,并且实现位于 MainActivity 中,在执行回调片段替换(不起作用)后,我还进行了检查。

if(!isAdded){
   return null
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试为每个片段创建新实例,但仍然没有成功。我被困了一段时间,请帮助我。

主要活动

 class MainActivity : AppCompatActivity(), IMainActivityContract.View {
    private lateinit var fragmentManager: FragmentTransaction

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Constants.mAuth = FirebaseAuth.getInstance()
        changeFragment(Constants.NAV_FRAG_LOGIN)
    }


    override fun changeFragment(fragmentID: Int) {
        if(supportFragmentManager.isDestroyed || supportFragmentManager.fragments.isEmpty()){
            fragmentManager = supportFragmentManager.beginTransaction()
        }

        try {
            when (fragmentID) {
                Constants.NAV_FRAG_LOGIN -> {
                    fragmentManager.replace(R.id.fragmentContainer,FragmentLogin()).commit()
                }

                Constants.NAV_FRAG_MAIN -> {
                    fragmentManager.replace(R.id.fragmentContainer, FragmentMain()).commit()

                }

                Constants.NAV_FRAG_ADDITION -> {
                    fragmentManager.replace(R.id.fragmentContainer,FragmentAddition()).commit()

                }

                Constants.NAV_FRAG_CONFIGURATION -> {
                    fragmentManager.replace(R.id.fragmentContainer,FragmentConfiguration()).commit()

                }
            }
        } catch (message: IllegalStateException) {
            Log.d("LoginDebug", "Exception …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-mvp

6
推荐指数
1
解决办法
9501
查看次数