SwipeRefreshLayout在协程中为空

时间:2019-07-15 11:28:46

标签: android android-fragments kotlin kotlin-android-extensions kotlin-coroutines

我的布局中有一个SwipeRefreshLayout,调用它时(setOnRefreshListener),我正在使用协程刷新我的recyclerview中的数据。

它按预期工作,但是从最近几天开始,我的Crashlytics崩溃了,日志如下:

Fatal Exception: java.lang.IllegalStateException: refresh must not be null
   at com.example.fragments.DataFragment$refreshData$1.invokeSuspend + 189(DataFragment.java:189)
   at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith + 33(BaseContinuationImpl.java:33)
   at kotlinx.coroutines.DispatchedTask.run + 233(DispatchedTask.java:233)
   at android.os.Handler.handleCallback + 751(Handler.java:751)
   at android.os.Handler.dispatchMessage + 95(Handler.java:95)
   at android.os.Looper.loop + 154(Looper.java:154)
   at android.app.ActivityThread.main + 6816(ActivityThread.java:6816)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run + 1563(ZygoteInit.java:1563)
   at com.android.internal.os.ZygoteInit.main + 1451(ZygoteInit.java:1451)

这是refreshData()方法-

private fun refreshData() {
    if (actionMode != null) actionMode!!.finish()
    myAdapter = Adapter(type, this@DataFragment)
    myAdapter!!.setEmptyView(empty_view)
    recycler_view.adapter = myAdapter
    refresh.isRefreshing = true

    //Get the Data List...
    launch {
        delay(1000)
        val dataList = getTheData() //This method uses withContext(Dispatchers.IO)
        myAdapter!!.addAll(dataList)
        myAdapter!!.toogleEmptyView()
        if (refresh.isRefreshing) refresh.isRefreshing = false //This is where the crash occurs, according to Crashlytics
    }
}

我正在使用kotlin-android-extensions,所以没有findViewById()

2 个答案:

答案 0 :(得分:0)

此错误与您的布局有关,我的意思是,当您使用kotlin-android-extensions时,必须始终确保在kotlin文件顶部使用正确的xml。

选中此选项

1)有时,您在两种不同的布局(例如:更新程序)中具有相同的ID,因此可能导致崩溃。您检查此刷新器是否与布局相同(可以单击刷新器上的cntr + B)

2)有时您会为差异Api创建两个差异布局,例如高于21,因此在低于21的某些设备中会发生此错误。

我希望它会有所帮助。如果我还记得的话,我会写下来

答案 1 :(得分:0)

我最终放弃了在片段中使用synthetic布局,因为我无法使其正常工作。
我还尝试访问像this@DataFragment.refresh这样的变量,以为该变量可能在协程范围内,因此无法访问(但是应该可以访问,因为CoroutineContext是{{1 }}),但是那也不起作用。


最后在Dispatchers.Main方法中使用相同的旧rootView.findViewById(),并且不再抛出该异常。