存储库模式由Hieatt和Rob Mee定义为设计模式,该模式使用类似集合的接口来访问域对象,从而在域和数据映射层之间进行调解.
基本上,它将一个或多个I/O设备(云,磁盘,数据库等)抽象为一个类似于集合的接口,您可以在其中读取,写入,查找和删除数据.
在Fernando Cejas的Android清洁架构中,应用程序所需的所有数据都来自此层,通过存储库实现(接口位于域层中),该实现使用存储库模式,其策略通过工厂选择不同的数据源,具体取决于一定条件下.
然而,正如Douglas Schmidt教授在Coursera课程中所指出的,内容提供商管理和调解对一个或多个应用程序的中央数据库的访问.
在Android编程一书中,内容提供程序用作RESTful Web服务的Facade.这种方法最初由 Virgil Dobjanschi在Google I/O 2010期间提出.
因此,为什么不使用它作为存储库模式本身而不是使用内容提供程序来访问本地SQLite数据库?
我一直在关注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!
我正在开发一个人类活动识别的Android应用程序.
它基本上就是这样 - 服务不断读取加速器数据并将识别的活动(即步行,运行)存储在数据库中.用户可以在活动中查看所有已识别的活动ListView(访问数据库).数据库中的每个User表都有一个pa_goal(物理活动目标)字段,服务从数据库中读取该字段并进行一些检查.
当然,用户可以从活动中更改此目标.因为我将实现MVP架构模式.
我不确定在哪里提供服务?肯定不是View.有什么建议?
我正在尝试重构现有的应用程序以使用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不再被调用 - 片段会自动重建,没有演示者.
这个问题有一个已知的解决方案吗?
我一直在阅读一些关于干净架构的文章,以及它如何在android中实现.我看到了显示其Android实现的示例应用程序.另外,我在Android上对Clean架构进行了很好的讨论
所以,我对大多数概念都有所了解,但我希望能够对某些事情有所了解.
根据我的理解,
我没有列出关于内层如存储库的更多细节,因为我的问题与上述步骤有关
在这里,演示者是否只能充当UseCases和UI之间的中介,作为数据调度员?
是否仅使用视图模型来使用案例模型转换,反之亦然?
输入验证逻辑依赖于哪一层?可以在演示者里面吗?例如,如果我们采用注册过程的小用例,
一旦用户输入了详细信息并单击了注册按钮,并将数据发送给演示者,就好了
第二个问题是,谁控制导航?View或Presenter或UseCase?
谁决定下一步去哪儿?
例如 - 考虑登录过程的用例,用户将在其中输入凭据并单击"确定".
成功登录后,
那么,谁负责在接下来的哪个屏幕上做出这些决定?它是演示者,它相应地决定和导航视图吗?或者是用例处理程序有责任告知演示者下一个状态是什么?
很抱歉提出这个问题的时间太长了,但我只是想详细说明我目前的理解.提前致谢
我有一个具有 MVP 架构模式的应用程序。现在,我正在尝试在我的应用程序中实现 Livedata。我搜索了很多,但找不到任何教程或示例。所有教程都说实时数据适用于 MVVM 模式。
在 MVP 模式中应用 Livedata 是一种正确的方法吗?
如果有人有关于在 MVP 中实现 Livedata 的想法,请分享。
提前致谢。
我使用MVP已有很长时间了,我开始转移到MVP和MVVM之间的混合状态
详细地,我的应用程序将如下所示:
我的问题:
例如,假设我有一个项目列表,而用户长按一个项目列表,则该体系结构的哪一部分应负责检查用户是否有权执行此操作,并让他们编辑该项目或显示错误信息?
例如,假设活动下面有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)
注意:我知道上面的代码不起作用,我要问的是是否有办法解决类似问题
例如,如果用户尝试删除条目,而我希望他们输入密码,则流程为:
感谢您提供任何帮助
android android-mvvm android-mvp android-architecture-components
我一直在学习和整合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
我第一次使用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) 我正在使用 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 ×10
android-mvp ×10
mvp ×3
kotlin ×2
android-architecture-components ×1
android-mvvm ×1
performance ×1