Android 添加工厂时的Moshi Bounds阵列异常

Android 添加工厂时的Moshi Bounds阵列异常,android,kotlin,moshi,Android,Kotlin,Moshi,在打开应用程序时,我发现此异常有时与Moshi有关: Caused by java.lang.ArrayIndexOutOfBoundsException: length=33; index=33 at java.util.ArrayList.add(ArrayList.java:468) at com.squareup.moshi.Moshi$Builder.add(Moshi.java:231) 我们在BaseApplication中初始化存储库,这有时会导致初

在打开应用程序时,我发现此异常有时与Moshi有关:

Caused by java.lang.ArrayIndexOutOfBoundsException: length=33; index=33
       at java.util.ArrayList.add(ArrayList.java:468)
       at com.squareup.moshi.Moshi$Builder.add(Moshi.java:231)
我们在BaseApplication中初始化存储库,这有时会导致初始化Moshi时出现上述崩溃。我在应用程序报告中发现此错误,但无法重现。让我们跳到我们所拥有的,看看你是否有线索

此工厂用于创建Moshi实例,在添加KotlinJsonAdapterFactory时发生崩溃:

object MyMoshiConverterFactory {

    fun create(setup: (Moshi.Builder.() -> Unit)? = null): Converter.Factory {
        val moshi = MoshiUtil.createMoshi()
        setup?.let { moshi.it() }
        moshi.add(KotlinJsonAdapterFactory()) // Here is the crash!
        return MoshiConverterFactory.create(moshi.build())
    }
}
这里我们有一个类,我们有我们使用的所有转换器。它确实有更多的转换器,但为了简单起见,我删除了其中的一些:

object MoshiUtil {

    private val lazyMoshi by lazy {
        Moshi.Builder().apply {
            add(DateAdapter())
            add(DefaultOnDataMismatchAdapter.newFactory(FeedItem::class.java, null))
            add(SkipListNullValuesAdapter.createFactory(Element::class.java))
            add(SkipListNullValuesAdapter.createFactory(Post::class.java))
            add(SkipListNullValuesAdapter.createFactory(MetadataItem::class.java))
            add(GeoGeometry::class.java, GeometryAdapter())
        }
    }

    fun createMoshi() = lazyMoshi
}
最后,在我们的BaseApplication中,我们有如下内容:

class BaseApplication {

   @Override
    public void onCreate() {
        super.onCreate();

        val myService = getMyService(applicationContext)

    }

    private fun getMyService(appContext: Context): MyService {
       val converterFactory = MyMoshiConverterFactory.create()

       return Retrofit.Builder().baseUrl(baseUrl).apply {
                addConverterFactory(converterFactory)
                client(okHttpClientBuilder.build())
            }.build().create(MyService::class.java)
        }
    }
 }

那么,你看到可能是什么原因造成的吗?您认为当应用程序中的多个位置同时创建MoshiUtils对象时,启动时是否会出现并发问题?。期待你们的消息,谢谢

Moshi.Builder
是可变的,并且不是线程安全的,因此您有时遇到的这个错误就是由此产生的竞争条件。您应该在此基础上调用
.build()
实例以获取一个不可变的
Moshi
实例,然后将
MoshiUtil.createMoshi
的返回值设置为
Moshi.newBuilder()
(创建一个
Moshi.Builder
已配置为现有
Moshi
实例),如下:

object MoshiUtil {
    private val baseMoshi: Moshi = Moshi.Builder().apply {
        // ...
    }.build()

    fun createMoshi(): Moshi.Builder = baseMoshi.newBuilder()
}
由于调用
createMoshi
的每个人现在都有自己的
Moshi.Builder
实例,因此不应该再有任何并发问题