Случайные сбои при использовании сопрограмм kotlin - PullRequest
0 голосов
/ 30 июня 2019

Я использую recyclerView для показа изображений / видео с sdCard, как приложение для галереи, и недавно я перешел на Kotlin и попытался использовать сопрограммы для фоновой работы.
Несмотря на то, что при запуске сопрограммы возникают случайные сбои, я не могу понять трассировку стека, показанную в Firebase Crashlytics, она показывает номер класса и строки, где происходит сбой, но не причину этого ..

Ниже приводится мой refresh() метод, при котором происходит сбой.

private fun refreshGallery() {
    gridView.adapter = null
    if (actionMode != null) actionMode!!.finish()
    myAdapter = Adapter(galleryType!!, this@BaseFragment) //This is where I am getting a crash on some devices...
    ref.isRefreshing = true

    launch {
        delay(1000)
        val statusList = getMediaFiles()
        myAdapter!!.addAll(statusList)

        myAdapter!!.setEmptyView(empty)
        gridView.adapter = myAdapter
        myAdapter!!.toogleEmptyView()
        if (ref.isRefreshing) ref.isRefreshing = false
    }
}

Этот метод вызывается в onCreateView() & swipeRefresh.setOnRefreshListener{}

Еще немного информации, я расширил CoroutineScope во Фрагменте, поэтому нет Global.launch{}
Я также пытался использовать модификатор suspend для функции, меняя withContext() на async{}.await, но он все равно вылетает.

Вот бревна от Crashlytics -

Caused by e.b
   at com.example.fragments.BaseFragment.refreshGallery + 352(BaseFragment.java:352)
   at com.example.fragments.BaseFragment.onCreateView + 233(BaseFragment.java:233)
   at androidx.fragment.app.Fragment.onCreateAnimator(Fragment.java:5)
   at androidx.fragment.app.Fragment.performCreateView + 2595(Fragment.java:2595)
   at androidx.fragment.app.FragmentManagerImpl.moveToState + 880(FragmentManagerImpl.java:880)
   at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState + 1237(FragmentManagerImpl.java:1237)
   at androidx.fragment.app.FragmentManagerImpl.moveToState + 1302(FragmentManagerImpl.java:1302)
   at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange + 2655(FragmentManagerImpl.java:2655)
   at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated + 2609(FragmentManagerImpl.java:2609)
   at androidx.fragment.app.FragmentController.dispatchActivityCreated + 246(FragmentController.java:246)
   at androidx.fragment.app.FragmentActivity.onStart + 542(FragmentActivity.java:542)
   at androidx.appcompat.app.AppCompatActivity.onStart + 201(AppCompatActivity.java:201)
   at com.example.MainActivity.onStart + 189(MainActivity.java:189)
   at android.app.Instrumentation.callActivityOnStart + 1249(Instrumentation.java:1249)
   at android.app.Activity.performStart + 6873(Activity.java:6873)
   at android.app.ActivityThread.performLaunchActivity + 2687(ActivityThread.java:2687)
   at android.app.ActivityThread.handleLaunchActivity + 2785(ActivityThread.java:2785)
   at android.app.ActivityThread.-wrap12(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage + 1532(ActivityThread.java:1532)
   at android.os.Handler.dispatchMessage + 102(Handler.java:102)
   at android.os.Looper.loop + 163(Looper.java:163)
   at android.app.ActivityThread.main + 6342(ActivityThread.java:6342)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run + 880(ZygoteInit.java:880)
   at com.android.internal.os.ZygoteInit.main + 770(ZygoteInit.java:770)

MainActivity's onStart() -

override fun onStart() {
    super.onStart()
    try {
        NotificationManagerCompat.from(this@MainActivity).cancelAll()
    } catch (ignore: Exception) {}
}

1 Ответ

0 голосов
/ 30 июня 2019

Первым шагом должно быть получение обфускации mapping.txt для рассматриваемой сборки и нахождение того, на что e.b отображается.

Однако, глядя на контекст, я предполагаю, что он отображается на kotlin.KotlinNullPointerException, который выдается, если переменная, которая была объявлена ​​как ненулевая (через !!), на самом деле оказывается null.

Поскольку это не имеет ничего общего с сопрограммами, а код, который имеет дело с рассматриваемой переменной (galleryType), не включен в ваш вопрос, дальнейшая отладка невозможна.

...