首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >容易的问题: Android观察者函数在我删除它试图观察的项后会导致空指针异常。

容易的问题: Android观察者函数在我删除它试图观察的项后会导致空指针异常。
EN

Stack Overflow用户
提问于 2022-04-11 23:12:02
回答 1查看 34关注 0票数 0

我正在用房间来管理我当地的字典数据库。我选择一个词,然后删除它,它应该导航回主页。但是,有时在删除单词之后,它会导致一个空指针异常,试图访问我删除的单词。当异常发生时,我可以尝试捕捉它,但是我想我缺少对这些生命周期是如何工作的基本理解,如果可能的话,我希望有一个更好的方法来实现它。我很感激这里的任何帮助。

这是我的片段中delete函数的代码:

代码语言:javascript
复制
    private fun deleteItem() {
    viewModel.deleteWord(word)
    findNavController().navigateUp()
}

不确定是否需要,但这里是我的刀,没有使用存储库。

代码语言:javascript
复制
@Dao
interface DictionaryDao {
    @Query("SELECT * FROM dictionary") // can alter this to order by word for example
    fun getAll(): Flow<List<DictionaryData>>
    @Query("SELECT * from dictionary WHERE id=:id")
    fun getContents(id: Int): Flow<DictionaryData>
    @Query("SELECT word FROM dictionary")
    fun getWordsList(): Flow<List<String>>

@Insert (onConflict = OnConflictStrategy.IGNORE)
suspend fun insert(word: DictionaryData)
@Update
suspend fun update(word: DictionaryData)
@Delete
suspend fun delete(word: DictionaryData)}

最重要的是,这里是带有观察者的片段,它在我删除之后一直试图访问我的word对象。

代码语言:javascript
复制
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val id = navigationArgs.itemId
    viewModel.retrieveData(id).observe(viewLifecycleOwner) { selectedItem ->
        word = selectedItem
        bind(word)
    }
}

而selectedItem对象是导致崩溃的原因:

代码语言:javascript
复制
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app1.personalpocketdictionary, PID: 12648
java.lang.NullPointerException: selectedItem must not be null
    at com.app1.personalpocketdictionary.fragments.ItemDetailFragment.onViewCreated$lambda-6(ItemDetailFragment.kt:114)

最后,在viewModel中使用了两个相关的函数:

代码语言:javascript
复制
    fun deleteWord(word: DictionaryData){
    viewModelScope.launch {
        dictionaryDao.delete(word)
        Log.d("devNotes", "doa delete successful")
    }
}

代码语言:javascript
复制
    fun retrieveData(id: Int) : LiveData<DictionaryData>{
    return dictionaryDao.getContents(id).asLiveData()
}

我想,在删除项目,甚至导航到另一个片段并完成新片段的onViewCreated函数之后,我们导航到的这个观察函数将不再被使用,但是不,它仍然在尝试获取数据。但只是有时候!当我删除,一半的时间崩溃,一半的时间,它的工作。请派人来帮忙。

如果有任何混淆之处,请原谅,我很乐意进一步澄清

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-12 00:28:21

您正在观察对数据库的查询结果,在该数据库中,您使用启动片段的ID获取项的值。我猜你用“单词”来显示数据。但是,当从DB中删除对象时,观察者保持不变,然后对带有该ID的DB的查询返回null,因为该对象不再存在。所以"word“就等于空了。"word“不被宣布为”空“。当您使用navigateUp时,片段不会立即被删除,而是会转到后台,并在那里发生崩溃。我可以想出两种方法来解决这个问题:

1-你宣布单词为空

代码语言:javascript
复制
var word: Object?

2-您比较观察者结果的值。

代码语言:javascript
复制
...
selectedItem?.let{
   word = it
   bind(word)
}
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71835294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档