ArrayList上的Android intent.getParcelableArrayListExtra< LatLng>引发Nullpointer异常

wwtsj6pe  于 2023-04-10  发布在  Android
关注(0)|答案(1)|浏览(208)

bounty还有6天到期。回答此问题可获得+50声望奖励。zxcisnoias希望引起更多关注此问题。

我试图将LatLng对象的数组列表传递给另一个Activity。该方法在Util类中定义,而该类不是Activity。但接收Activity总是引发NullpointerException

class Utils {
    companion object {
        fun startMaps(pairs: MutableList<LatLng>){
            var intent = Intent(AAddressActivity.appContext, MapActivity::class.java)
            Log.d("pair", ArrayList(pairs).toString())
            Log.d("pair", ArrayList(pairs)[0].toString())
            intent.putParcelableArrayListExtra("key", ArrayList(pairs))

            AAddressActivity.appContext.startActivity(intent)
        }
}

Log.d打印非空对的内容。///AAddressActivity.appContext其中AAddressActivity是调用Utils.startMap()方法的Activity,appContext定义为

companion object{
        lateinit  var appContext: Context
    }

并在onCreate() AAddressActivity中初始化为appContext=this,以允许外部访问AAddressActivity的上下文。
这是接收活动:

class MapActivity : AppCompatActivity(), OnMapReadyCallback {
    lateinit var latLngList: ArrayList<LatLng>
    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_map)

        // Error happens here
        latLngList = intent.getParcelableArrayListExtra("key", LatLng::class.java)!!
        Log.d("longMap", latLngList[0].toString())

    }

错误是

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androidapplicationproject/com.example.androidapplicationproject.mapUtil.MapActivity}: 
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Class.isInterface()' on a null object reference

据我所知,LatLng对象实现了Parcelable,所以我不应该担心这一点。但是为什么会发生错误?我如何修复它?
我刚刚发现,如果pairs中只有一个元素,那么MapActivity可以成功接收包裹,但如果列表中有两个或更多元素,则会引发异常。

vc6uscn9

vc6uscn91#

我复制了这个问题,因为它似乎没有任何错误的代码,我googled for "parcelablearraylist bug",并发现this Reddit threada comment链接到this bug report,谷歌工程师承认这是一个错误。
所以要回答这个问题:
但为什么会出现错误呢?
这是一个新方法的bug,它接受一个Class参数。
我该怎么弥补。
坚持使用不接受Class参数的旧方法(如getParcelableArrayListExtra),直到bug被修复或者他们发布了一个可以正常工作的Compat版本的API。

相关问题