我的布局中有一个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()
答案 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()
,并且不再抛出该异常。