我试图将LatLng对象的数组列表传递给另一个活动。该方法在Util类中定义,而Util类不是活动。但接收活动总是提高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()
方法的活动,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
可以成功接收包裹,但如果列表中有两个或更多元素,则会引发异常。
我重现了这个问题,由于代码似乎没有任何问题,我在谷歌上搜索了"parcelablearraylist "发现Reddit上有一条评论链接到这个bug报告,其中一位谷歌工程师承认这是一个bug。
那么回答这个问题:
但是为什么会发生错误?
接受Class
参数的新方法有一个bug。
如何修复
坚持使用不接受Class
参数的旧方法(如getParcelableArrayListExtra),直到错误被修复或他们发布了一个可以正常工作的API的比较版本。