removeObserver() 不会删除观察者(android、java)

问题描述 投票:0回答:1

我有一个 viewModel 和一个运行良好的观察者。事实上,太好了,因为即使我好意地请求,观察者也拒绝被移除。

有人能看出哪里出了问题吗?

这是我尝试过的:

  MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
  final Observer<List<String>> my_observer = new Observer<List<String>>() {
            @Override
            public void onChanged(List<String> firstNames) {
                ... some code ...
            }
        };

  viewModel.getFirstNames(lastName).observe(this,my_observer);
  viewModel.getFirstNames(lastName).removeObserver(my_observer);

我也尝试过

removeObservers(this,my_observer)
,但是只要更改、添加或删除其中一个“firstName”(并且“lastName”保持不变),my_observer 中的代码就会运行。

在 stackoverflow 上有很多关于这个问题的问题,我花了几个小时(甚至可能是几天)阅读、搜索和尝试,但我找到的问题和答案都没有解决我的问题,因为其他人缺乏对问题的输入viewModel(此处为“lastName”)。

这里有更多所要求的代码 - 它工作得很好,因为我确实得到了所有的名字。 ;-)

--- MyViewModel ---

public class MyViewModel extends AndroidViewModel {
    public static MyRepository myRepository;

    public MyViewModel(@NonNull Application application) {
        super(application);
        myRepository = new MyRepository(application);
    }

    public LiveData<List<String>> getFirstNames(String lastName){
        return myRepository.getFirstNames(lastName);
    }
}

--- 我的存储库 ---

public class MyRepository {
    private final MyDao myDao;

    public MyRepository(Application application) {
        MyRoomDatabase db = MyRoomDatabase.getDatabase(application);
        myDao = db.myDao();
    }

    public LiveData<List<String>> getFirstNames(String lastName){
        return myDao.getFirstNames(lastName);
    }
}

--- MyDao ---

@Dao
public interface MyDao {
    @Query("SELECT * FROM table_names AS tn " +
            "WHERE tn.lastname LIKE :lastName " +
            "ORDER BY tn.firstname ASC")
    LiveData<List<String>> getFirstNames(String lastName);
}
java android android-room
1个回答
0
投票

当你最终寻求帮助时,经常会发生一件有趣的事情:你往往会自己弄清楚......

我已经初始化了我的观察者,但没有初始化我的 LiveData 实例。因此,我创建了一个无法删除的匿名 LiveData 实例。

这最终对我有用:

MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);

// Store the LiveData instance in a variable
LiveData<List<String>> liveNames = viewModel.getFirstNames(lastName);

// Observe the LiveData
liveName.observe(this, names -> {
     ... some code ...
     // Remove all observers for the liveData instance
     liveNames.removeObservers(this);
});

希望它对某人有帮助;-)

© www.soinside.com 2019 - 2024. All rights reserved.