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
可以成功接收包裹,但如果列表中有两个或更多元素,则会引发异常。
1条答案
按热度按时间vc6uscn91#
我复制了这个问题,因为它似乎没有任何错误的代码,我googled for "parcelablearraylist bug",并发现this Reddit thread有a comment链接到this bug report,谷歌工程师承认这是一个错误。
所以要回答这个问题:
但为什么会出现错误呢?
这是一个新方法的bug,它接受一个
Class
参数。我该怎么弥补。
坚持使用不接受
Class
参数的旧方法(如getParcelableArrayListExtra),直到bug被修复或者他们发布了一个可以正常工作的Compat版本的API。