几年来我一直在开发Android应用程序.最近我在我的应用程序中使用了MVP架构,经过大量阅读并使用了这款Android10 github repo.
但是我对这个MVP架构的问题很少,我正在寻找.请帮助我更好地理解这些.
1)所以我有三个模块应用程序,域,数据.哪些模块主持人会去.在一些应用程序中,他们在域中有它但我看到一些其他库在演示文稿或应用程序模块中有这样的https://github.com/android10/Android-CleanArchitecture.
2)演示者可以使用Android相关的内容,如Intents,Contexts,SharedPrefs等吗?我不认为这应该发生.
3)数据模块可以与app模块通信,反之亦然或app模块应该与域模块通信,这些模块在数据模块上执行任务
4)我如何使用MVP架构进行Facebook等社交登录...任何想法或链接解释?我是以下面的方式做到的:
活动:onFBButtonClick()- > presenter.onButtonClick()- >FacebookLoginManager.registerCallback
在此之后我直接得到了我的活动回调onActivityResult(int requestcode, int resultcode, Intent intent).现在根据fb sdk教程我必须打电话FbCallbackManager.onActivityResult(with all the params).但我不能在演示者中传递这些信息,因为演示者不应该知道意图(平台特定)的事情.我怎么现在打电话FbcallbackManager.onActivity()?
我有一个应用程序,从现在开始我的api填充了一个列表.现在我正在检测onClick recyclerView,我想打开GoogleMaps一个标记,专注于我点击的项目(我有lat和long).有没有一个很好的方法用它的存储库,用例,模型等来做到这一点?
事情就是我在我的ModelView上有它的坐标,以及cat的类型,也就是id.
问题是我不知道要向其他活动发送什么,因为每次我进行api调用时数据都会发生变化,所以我不知道是否必须将它存储在任何地方,然后从listView显示数据然后创建一个刷新我可以从api重新启动数据的mapActivity上的按钮.
希望你能理解我的问题.
我正在关注的一个例子是:GitHub存储库这是我作为列表所拥有的,然后当点击一个项目时它应该打开地图.
当我点击列表中的某个项目时,我最终通过了列表(如果您有任何其他方式,请随时告诉我)
然后我创建了一个合同:
interface Presenter{
fun onMapReady()
}
interface View{
fun focusOnItem(latitude: Double, longitude: Double)
fun putMarkers(mList)
}
Run Code Online (Sandbox Code Playgroud)
然后我不知道rxJava我的演示者在哪里使用,因为我需要等到我为我的演示者设置视图和数据的东西,当我填满所有然后首先开始做putMarkers,然后focusOnItem,但我坚持这个.
所以我现在正在做的是从mapActivity我设置列表然后我想开始做这个工作.
从开始我有一个活动(从Github仓库几乎相同,然后我需要将列表传递给我的其他活动,我最终做了一个设置者到一个演示者,因为匕首不知道该列表所以,我的问题现在我如何用rxJava设置所有MVP来加载地图并在其上加载标记.它还应该缩放到点击的元素但我已经有了位置.
有了一个简单的伪如果你说服自己这样做我会接受你的答案是正确的,我只需要弄明白如何在rxJava中做到这一点.
我第一次使用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) 我是 Dagger2 依赖注入的新手。当屏幕旋转时,我很难保留相同的组件。
@Inject
MainActivityPresenterImpl presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
component = DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(this))
.applicationComponent(TrainningDagger3.get(this).getComponent())
.build();
component.inject(this);
presenter.fetchData();
}
Run Code Online (Sandbox Code Playgroud)
我尝试调试应用程序,我认为当加载新配置时,它会创建组件的新实例和演示者的新实例。当屏幕旋转时,如何保留相同的组件和演示者。太感谢了!
我正在尝试在我的android项目中实现MVP。但是,当我使用实施MVP时,我会遇到困难viewPagerAdapter。为了实现MVP,我们曾经在Activityclass中创建fragment / view和presenter实例.Fragment / view和presenter都将使用合约相互通信。这样,我们将视图与演示者分离,并通过单元测试涵盖了所有业务逻辑。但以防万一,当我们有tablayout里面activity。我们已经在内部初始化了片段fragmentPagerAdapter。我不确定如何向其相应的演示者提供选项卡片段/视图引用。如果我在内部初始化演示者fragmentPagerAdapter会漂白SRP(单一责任主体)。如果我们在里面创建presenter实例Fragment这将生成耦合的代码,然后我们不需要联系就可以在片段和演示者之间建立通信。请提供体系结构解决方案,以便我可以使用视图分页器实现相同的MVP并遵守所有干净的代码主体。
作为参考,请在我的适配器代码下面找到我正在初始化Tab的片段:
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return getConfigurationsTabFragment();
case 1:
return UpdateTabFragment.newInstance();
case 2:
return ServiceTabFragment.newInstance();
default:
return null;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用 MVP 模式的 Kotlin Android 大项目,我开始努力进行单元测试(测试模拟视图界面的演示者)。原因是我在演示者中传递对我的函数的视图引用,并且必须模拟它们真的很糟糕,例如:
我的代码如下所示:
class MainActivity : Activity(), MainActivityView {
@BindView(R.id.numberTV)
lateinit var numberTV : AppCompatTextView
private val mainActivityPresenter = MainActivityPresenter(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainActivityPresenter.onCreate()
}
override fun showNumber() {
mainActivityPresenter.showNumber(numberTV, 22)
}
}
interface MainActivityView {
fun showNumber()
}
class MainActivityPresenter(private val mainActivityView: MainActivityView) {
fun showNumber(numberTV: AppCompatTextView, number: Int) {
numberTV.text = if (number < 0) {
"Not compatible"
} else if (number < 10) {
number.toString()
} else {
"9+" …Run Code Online (Sandbox Code Playgroud) 我想用一个主要活动和多个片段制作一个简单的项目。在这里,我在一个活动中有两个片段,我想将演示者注入登录片段,但它不起作用。我的错误在哪里?
主应用程序
public class MainApplication extends DaggerApplication{
private static ApplicationComponent component;
@Override
public void onCreate() {
super.onCreate();
Utils.init(this);
}
public static ApplicationComponent getComponent() {
return component;
}
protected AndroidInjector<? extends DaggerApplication> applicationInjector()
{
component =
DaggerApplicationComponent.builder().application(this).build();
component.inject(this);
return component;
}
}
Run Code Online (Sandbox Code Playgroud)
主活动.java
public class MainActivity extends DaggerAppCompatActivity {
private Fragment[] mFragments = new Fragment[2];
private int curIndex;
@Inject
HomeFragment homeFragment;
@Inject
LoginFragment loginFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
curIndex = savedInstanceState.getInt("curIndex");
} …Run Code Online (Sandbox Code Playgroud) 我见过 Android 中 MVP 模式的两种方法。两者都在Android 架构蓝图中使用:
public interface Contract {
interface View {
void showData(String data);
}
interface StartVersionPresenter {
void start();
}
interface DropViewVersionPresenter {
void takeView(View view);
void dropView();
}
}
Run Code Online (Sandbox Code Playgroud)
1)通过构造函数注入视图的演示者:
public class StartVersionPresenter implements Contract.StartVersionPresenter {
private final Contract.View view;
private final Repository repository;
public StartVersionPresenter(Contract.View view, Repository repository) {
this.view = view;
this.repository = repository;
}
@Override
public void start() {
loadData();
}
private void loadData() {
repository.getData(new DataCallback() {
@Override
public …Run Code Online (Sandbox Code Playgroud) 从官方得知
ViewModel 类旨在以生命周期意识的方式存储和管理 UI 相关数据
但我认为很多开发人员ViewModel同时用作数据存储和控制器(例如调用存储库、数据的网络客户端)。我还使用 as 作为数据存储和视图控制器。
Android官方示例代码也有一些控制器逻辑。来自官方:
class MyViewModel : ViewModel() {
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData().also {
loadUsers()
}
}
fun getUsers(): LiveData<List<User>> {
return users
}
private fun loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
Run Code Online (Sandbox Code Playgroud)
这里loadUsers可能会调用一些Repository或NetworkClient。所以在这里它就像控制器一样。
我确信许多开发人员都这样做,但从定义上看ViewModel应该存储和管理 UI 相关数据,应该ViewModel充当控制器吗?
我发现了一些 stackoverflow 线程这个和这个关于这个。
第一个接受的答案建议不要用作ViewModel控制器并使用 …
android android-mvp android-viewmodel android-architecture-components
android ×10
android-mvp ×10
dagger-2 ×3
mvp ×3
dagger ×2
java ×2
kotlin ×2
android-architecture-components ×1
google-maps ×1
rx-java ×1
unit-testing ×1