【问题标题】:How do I solve "anonymous class derived from observer" error with observer method in viewModel如何使用 viewModel 中的观察者方法解决“从观察者派生的匿名类”错误
【发布时间】:2019-01-28 13:09:04
【问题描述】:

我在MainActivity() 中成功使用了一个观察者方法,如下所示:

public void inputNameTest(String inputName) {
    myViewModel.inputNameTesting(inputName).observe( this, new Observer<List<MyRoomEntity>>() {
        @Override
        public void onChanged(@Nullable List<MyRoomEntity> myRoomEntities) {
            //Sets data in RecyclerView
            myAdapter.setList( myRoomEntities );
        }
    } );
}

这会将用户输入数据设置为Room 查询并在RecyclerView 中显示查询。但是,我想将函数移至 ViewModel,以防止 View 混乱。

ViewModel 中,new Observer&lt;List&lt;MyRoomEntity&gt;&gt;() 上有一条红色下划线,上面写着anonymous class must either be declared abstract or implement abstract method

如果我将Observer 更改为new android.arch.lifecycle.Observer&lt;List&lt;MyRoomEntity&gt;&gt;()(如Android-Studio 所建议),红色下划线消失。

我还需要传递owner 参数而不是this。我通过从MainActivity() 传递this 来管理它

myViewModel.setOwner( this );

致我的ViewModel

public void setOwner(LifecycleOwner owner) {
    this.mOwner = owner;
}

完成后,ViewModel 中的 Observer 方法如下所示:

public void getUserInputName(String inputName) {
    repository.getUserInputName(inputName).observe( mOwner, new android.arch.lifecycle.Observer<List<MyRoomEntity>>() {
        @Override
        public void onChanged(@Nullable List<MyRoomEntity> myRoomEntities) {

            Log.d("TAG", "OBSERVED INPUT NAME");
            if(myRoomEntities != null) {
                for(MyRoomEntity item: myRoomEntities) {
                    Log.d("TAG ROOM ", "Input Name: " + item.toString());
                }
            }
            myAdapter.setList( myRoomEntities );

        }
    } );
}

没有产生错误,但由于某种原因,RecyclerView 中没有显示任何内容。我确实从Observer 方法得到了正确的Log 输出:

Input Name: MyRoomEntity{id=2, name='Joe', date='1/3/2015', from='12.30', until='13:00'}

所以,如果我在 EditText 框中写“Joe”并按下按钮,RecyclerView 中不会显示任何内容,但我确实得到了正确的 Log。如果我在MainActivity() 中保留Observer 方法,我会得到正确的LogRecyclerView 输出。

不知道出了什么问题,但肯定是我对Observer 方法所做的两个更改。

【问题讨论】:

    标签: java android observable android-room


    【解决方案1】:

    通过这种实现,您将所有 google 的工作都扔进垃圾箱,因为您所做的是提供 MainActivity 对 ViewModel 类的引用,而使用 MVVM 的主要目的是避免这个问题,以防万一您的活动或片段被破坏并被破坏时是安全的能够在屏幕变化的情况下保存数据状态。 所以不要在 ViewModel 类中移动观察者代码,它不会“弄乱”活动。

    【讨论】:

    • 啊,好吧,那我就把它保存在MainActivity() 中呢?谢谢@Maksim :)
    • 没错,记住主要思想是保持数据与 UI 层隔离。如果它解决了您的问题,请将其标记为答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多