标签: android-mvvm

使用Kotlin学习Android MVVM架构组件

搜索了android体系结构组件后,我意识到MVVM在某些方面要优于其他体系结构,因此我开始学习MVVM,并且我使用的是Kotlin语言,但问题是当我搜索教程以开始学习时,发现了很多组件,例如RxJava, RxAndroid,Dagger2,Room,Lifecycle等,但他们没有说明为什么要使用它们以及为什么要选择某些特定组件。我会给你看一些例子:

1-具有Dagger2,翻新,RxJava的Android MVVM

2-具有Dagger2,翻新,RxAndroid的Android MVVM

3-带有MVVM dagger2 RxJava Livedata和Room的Android应用

我的问题是:

1-我应该如何决定选择其中一些组件并与之一起使用?

2-我怎么知道我需要一起使用其中的一些(例如Livedata和RxJava)?

这对我来说真的很混乱,我不知道如何开始。

android design-patterns kotlin android-mvvm android-architecture-components

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

在ViewModels之间共享数据

我的项目中有一个复杂的屏幕,我打破了多个片段.我正在尝试遵循这些类的MVVM架构,因此哪个片段有自己的ViewModelContract类.

问题是所有ViewModel都需要相同的对象实例(让我们称之为Book)来进行Room事务.

它是否有正确的方法LiveData在ViewModels之间共享数据(或)?我知道共享ViewModel的概念,但我不知道是否可以将它应用于此案例.我也想过使用,MediatorLiveData但也没有得到一个好的方法.

我正在考虑BookObservableProvider使用LiveData<Book>(或Rx Subject<Book>)一个类(让我们调用),其中每个ViewModel注入相同的实例并且加载/更新总是相同的值.

这是一个好方法吗?

android android-mvvm android-livedata android-viewmodel

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

有关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
查看次数

获取 java.lang.RuntimeException: 无法从绑定实现方法调用观察者方法

请帮我解决我的问题。我想从我的数据库中获取 LiveData 并用 recycleview 显示它。我在 Repository 中有从数据库中获取它的方法:

fun getEthTransactions(): LiveData<List<EthTransaction>> {
        return mEthTransactionsDao.getTransactions()
    }
Run Code Online (Sandbox Code Playgroud)

我检查了这个方法返回的不是 null。

在 ViewModel 我这样做:

private val ethRepository: EthRepository = EthRepository(application)

    val transactionData: LiveData<List<EthTransaction>>
        get() = ethRepository.getEthTransactions()
Run Code Online (Sandbox Code Playgroud)

在片段中,我尝试获取 viewModel 并绑定绑定:

private val journalFragmentViewModel by lazy {
        ViewModelProviders.of(this).get(JournalFragmentViewModel::class.java)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val activityJournalBinding : FragmentJournalBinding =  DataBindingUtil.inflate(inflater, R.layout.fragment_journal, container,false)

        journalFragmentViewModel.transactionData.observe(this, Observer {
            activityJournalBinding.viewModel = journalFragmentViewModel
            JournalAdapter().journal = it
        })

        activityJournalBinding.viewModel = journalFragmentViewModel
        activityJournalBinding.lifecycleOwner = this
        return activityJournalBinding.root
    }

    override …
Run Code Online (Sandbox Code Playgroud)

android android-databinding android-mvvm android-room android-livedata

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

LiveData 分页列表大小始终为 0

我使用android分页库实现了分页。ViewModel 返回 aLiveData<PagedList<MyObject>>并且我观察到在我设置适配器的片段中一切正常,除了当我想检查列表的大小时始终为 0。

viewModel.getSearchResults().observe(this, mList -> {
           adapter.submitList(mList);
           Log.e("Count", String.valueOf(mList.size()));
       });
Run Code Online (Sandbox Code Playgroud)

其中 mList 是 PagedList<MyObject>

android android-mvvm android-livedata android-paging android-paging-library

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

使用 mvvm 时将业务逻辑放在哪里

我正在使用MVVM 设计模式制作用户登录屏幕,但是在实现电话号码验证逻辑时我被卡住了。我宣读了使用 mvvm 时要遵循的规则 (第 4 条规则),View 中不应包含任何逻辑,甚至不是简单的 if 条件。视图的所有逻辑都发生在 ViewModel 中。

这是我的 ViewModel 类。

public class LoginViewModel extends AndroidViewModel {

    private LoginRepository loginRepository;
    private HashMap<String,String> mNumberParam;
    private MutableLiveData<Boolean> isValidated;

    public LoginViewModel(@NonNull Application application) {
        super(application);
        loginRepository=LoginRepository.getInstance();
        isValidated=new MutableLiveData<>();
    }


    public LiveData<List<OtpEnterModel.Data>> enterNumberApiHit(){
        return loginRepository.enterNumberApiHit(mNumberParam);
    }


    public void onSubmitClick(String number){

        //if mobile number not enter or wrong enter show message ,and tell the view to hide other view
        if (number==null) {
            Toast.makeText(getApplication(), "Invalid mobile …
Run Code Online (Sandbox Code Playgroud)

java android design-patterns android-mvvm android-jetpack

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

MVVM with Retrofit - 如何处理 Repository 中的大量 LiveData?

我正在关注这个关于使用 MVVM 和 Retrofit 的教程

https://medium.com/@ronkan26/viewmodel-using-retrofit-mvvm-architecture-f759a0291b49

用户将 MutableLiveData 放置在 Repository 类中的位置:

public class MovieRepository {
    private static final ApiInterface myInterface;
    private final MutableLiveData<EntityMovieOutputs> listOfMovies = new MutableLiveData<>();

private static MovieRepository newsRepository;

    public static MovieRepository getInstance(){
        if (newsRepository == null){
            newsRepository = new NewsRepository();
        }
        return movieRepository;
    }

    public MovieRepository(){
        myInterface = RetrofitService.getInterface();
    }
Run Code Online (Sandbox Code Playgroud)

I'm building a simple app and what I noticed is my repository class is quickly being filled with a lot of MutableLiveData objects. Is this actually the …

java android android-mvvm android-livedata

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

使用共享 ViewModel 的多个片段中的单个实时事件

我在多个片段中有一个共享视图模型。

class MainFragment {
      private val sharedViewModel: HomeActivityViewModel by activityViewModels()
}

class MagazinesFragment {
      private val sharedViewModel: HomeActivityViewModel by activityViewModels()
}
Run Code Online (Sandbox Code Playgroud)

我在该共享视图模型中有一个事件。

class HomeActivityViewModel{
       val userAuthStatusChanges = MutableLiveData<Boolean>()
}
Run Code Online (Sandbox Code Playgroud)

我正在多个片段中观察该事件。

 class MainFragment {
       //...
          sharedViewModel.userAuthStatusChanges.observe(viewLifecycleOwner) {
            // do smth
        }
    }
    
 class MagazinesFragment {
         //...
          sharedViewModel.userAuthStatusChanges.observe(viewLifecycleOwner) {
            // do smth
        }
    }
Run Code Online (Sandbox Code Playgroud)

每当该userAuthStatusChanges事件发生时,我想在观察该事件的所有片段中触发单个实时事件。

如果我将事件设置为 MutableLiveData,则每当重新创建片段时都会观察到该事件。如果我使用SingleLiveEvent,则该事件仅被观察到一次并且仅在一个片段中被观察到。

我希望在所有片段中触发此事件,并且每个片段中仅触发一次。我正在使用导航组件。

android android-mvvm android-livedata android-jetpack

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

在 MVVM 架构 Android 中启动 WorkManager 的正确位置是什么?

我有一个工作管理器,每五个小时从 roomdb 中提取一个单词并通知

我不知道将工作管理器放在 MVVM 架构中的正确位置。我应该在 ViewModel 还是 Repository 中使用?

android mvvm android-mvvm android-architecture-components android-workmanager

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

Google SignInButton 的 onClick 无法使用 DataBinding

当我尝试onClick在我的 Google 中设置方法时SignInButton

android:onClick="@{() -> viewModel.onGoogleLoginClick()}"

我总是收到这个错误:

发现数据绑定错误。

****/ 数据绑定错误 ****msg: 找不到正确的 android:onClick 回调类。尝试 android.view.View 但它有 0 个抽象方法,应该有 1 个抽象方法。

文件:/Users/user/Android/project/app/src/main/res/layout/activity_login.xml loc:53:31 - 53:66 ****\ 数据绑定错误****

这是我的代码:

活动登录.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ui.login.LoginActivity">
    <data>
        <import type="android.view.View" />
        <variable
            name="viewModel"
            type="com.example.myapp.ui.login.LoginViewModel" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:padding="@dimen/default_layout_padding">

        <EditText
            android:id="@+id/login_name_editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/login_username_hint"
            android:inputType="text"
            android:text="@{viewModel.mEmail}" />

        <EditText
            android:id="@+id/login_pass_editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/login_name_editText"
            android:hint="@string/login_password_hint"
            android:inputType="numberPassword"
            android:text="@{viewModel.mPassword}" />

        <Button
            android:id="@+id/login_login_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/login_pass_editText"
            android:onClick="@{() -> viewModel.onServerLoginClick()}"
            android:text="@string/login_login_button_text" …
Run Code Online (Sandbox Code Playgroud)

data-binding android button android-mvvm android-livedata

7
推荐指数
2
解决办法
1674
查看次数