【发布时间】:2023-03-21 14:10:01
【问题描述】:
来自德国的问候!
今天我在尝试这样做时遇到了一个非常奇怪的问题:
位置 -> 包裹 -> 位置
我尝试使用以下方法从某个位置创建地块:
location.writeToParcel(parcel, flags) 和
parcel.writeParcelable(位置,标志)
并使用以下方法从这些包裹中检索位置:
parcel.readParcelable(Location.class.getClassLoader()) 和
Location.CREATOR.createFromParcel(parcel)
以下代码片段显示了从有效位置(参见代码顶部)到包裹并返回到该位置的所有 4 种可能组合。但是,这两种方法都没有按预期工作,我想不出这里出了什么问题。
在尝试从包裹中检索位置后,日志的相关部分会显示在 cmets 中。
我从一个有效的位置开始,如下所示:
import android.location.Location;
import android.os.Parcel;
[...]
// locationList as arrived in a broadcast via FusedLocationProviderClient, locations are O.K.
Location location = locationList.get(0);
Timber.d("in: "+String.format("%.1f",location.getLatitude()) + "/" +
String.format("%.1f",(location.getLongitude())));
// result: "[...] in: 47,8/12,6" (<- just to demonstrate locations are fine at this point)
但是,我似乎没有从这个位置收到有效的包裹。
第一次尝试:使用 parcel.writeParcelable() 创建包裹
Parcel parcel1 = Parcel.obtain();
parcel1.writeParcelable(location, 0);
Location location1a = parcel1.readParcelable(Location.class.getClassLoader());
Timber.d("out1a: "+String.format("%.1f",location1a.getLatitude()) + "/" +
String.format("%.1f",(location1a.getLongitude())));
// result: NullPointerException "[...] Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference"
Location location1b = Location.CREATOR.createFromParcel(parcel1);
Timber.d("out1b: "+String.format("%.1f",location1b.getLatitude()) + "/" +
String.format("%.1f",(location1b.getLongitude())));
// result: "[...] out1b: 0,0/0,0"
我应该补充
- parcel1 在调试器中 parcel.writeParcelable() 后看起来完全没有变化
- 不仅经纬度为0,location1b内的所有数据都为0
第二次尝试:使用 location.writeToParcel() 创建包裹
Parcel parcel2 = Parcel.obtain();
location.writeToParcel(parcel2, 0);
Location location2a = parcel1.readParcelable(Location.class.getClassLoader());
Timber.d("out2a: "+String.format("%.1f",location2a.getLatitude()) + "/" +
String.format("%.1f",(location2a.getLongitude())));
// result: NullPointerException "... Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference"
Location location2b = Location.CREATOR.createFromParcel(parcel2);
Timber.d("out2b: "+String.format("%.1f",location2b.getLatitude()) + "/" +
String.format("%.1f",(location2b.getLongitude())));
// result: "[...] out2b: 0,0/0,0"
同样,location2b 中的所有数据都是 0,在我看来,在 location.writeToParcel() 之后 parcel2 也没有变化。
看起来有什么根本上的问题。知道它是什么吗?位置是否忘记了如何将其状态正确地保存到一个包裹中,或者我是否忘记了如何正确地包裹一个位置?
(使用搭载 Android 7.0 的真实设备)
【问题讨论】:
标签: android location parcelable parcel fusedlocationproviderclient