getIntent (). getExtras () иногда дает сбой в Activity - PullRequest
3 голосов
/ 03 августа 2020

Я запускаю Intent с некоторыми дополнениями и читаю переданные дополнения в Activity onCreate

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val extras: Bundle? = intent.extras // <-- crash
        val someInt = extras?.getInt(EXTRA_SOME_INT, -1) ?: -1

        // ...
    }

    companion object {

        const val EXTRA_SOME_INT = "someInt"

        fun createIntent(context: Context, someInt: Int) =
            Intent(context, MyActivity::class.java).apply {
                putExtra(EXTRA_SOME_INT, someInt)
            }
    }
}

// Activity started like this:
fun startMyActivity(context: Context) {
    context.startActivity(MyActivity.createIntent(context, 1234))
}

Это отлично работает, однако в производстве отмеченная строка иногда заставляет приложение ломаться sh когда вызывается getExtras(). Согласно документации, он может иметь значение NULL, но он не должен вызывать исключение.

Журнал сбоев не всегда один и тот же, но либо это происходит в BaseBundle:

java.lang.NullPointerException
Attempt to invoke virtual method 'int android.os.Parcel.dataSize()' on a null object reference

BaseBundle.java line 164 in android.os.BaseBundle.<init>()
Bundle.java line 106 in android.os.Bundle.<init>()
Intent.java line 6580 in android.content.Intent.getExtras()

. .. или это происходит:

java.lang.IllegalArgumentException
Duplicate key in ArrayMap:

BaseBundle.java line 126 in android.os.BaseBundle.<init>()
Bundle.java line 102 in android.os.Bundle.<init>()
Intent.java line 5756 in android.content.Intent.getExtras()

Cra sh происходит только на Android 5, 6 или 7. Я не нашел способа воспроизвести его на моем собственном устройстве.

Я что-то делаю не так, или как лучше всего избежать этого sh? Без дополнительного пакета я не могу отображать свою активность.

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

Это была ошибка в AOSP, которая была исправлена ​​ после Android 7. Вот причина в сообщении фиксации:

Исправление гонки в writeToParcel и unparcel

Не обращаться к разложенным данным, пока они могут быть переработаны другим потоком.

Также создайте локальную ссылку на mMap, которая может быть изменена другим потоком.

0 голосов
/ 04 августа 2020
    Bundle receiveData = getIntent().getExtras();

    if (receiveData != null){
        .....
    }
...