首页 > 解决方案 > 存储在类扩展应用程序中的数据返回 null

问题描述

我有一个扩展应用程序的数据类,它应该存储的数据集之一是 POI 位置和访问时间的 HashMap

public class CharacterSheet extends Application {
private HashMap<PointOfInterest, Date> coolDowns = new HashMap<>();

    public HashMap GetAllCoolDowns() { return coolDowns; } //dev only?
    public Date GetCoolDown(PointOfInterest poi) {return coolDowns.get(poi);}
    public Date PutCoolDown(PointOfInterest poi, Date date) {return coolDowns.put(poi, date);}}

然后在谷歌地图活动中,我抓住了 OnPOIclick

    @Override
public void onPoiClick(final PointOfInterest poi) {

    //POI Cool Down
    Date currentTime = Calendar.getInstance().getTime();
    Date lastTime = ((CharacterSheet) this.getApplication()).GetCoolDown(poi);//this ONLY returns null??

    if (lastTime != null){
        int timeDiff = currentTime.compareTo(lastTime);
        makeToast("Time Since last visit: " + timeDiff );
    } else { makeToast("First");
        }

    ((CharacterSheet) this.getApplication()).PutCoolDown(poi, currentTime);
    makeToast("This?" + ((CharacterSheet) this.getApplication()).GetCoolDown(poi));}

顺序应该是 Click poi, Get current time.. 获取上次访问的时间,如果 last time 为 null.. 从未去过,将时间和日期存储在以 poi 为 key 的 hashmap 中

下一次出现,这次最后一次不应该为空,因为我们已经存储了这个 poi 和时间.. 但无论它返回什么都为空..

最后一行代码是一个 makeToast 助手,它告诉我数据类中有什么。这给了我一个日期值,当我单击时不是空值

稍后在 OnPOIClick 中生成了一个片段,但仍然在用户可以做任何事情之前,你最终会看到并不得不“退出”,我不知道这会如何影响它,因为所有代码都是甚至在为片段调用数据之前完成但感觉应该提到

        PlacesClient placesClient = Places.createClient(this);
    String placeId = poi.placeId;
    List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.TYPES);
    FetchPlaceRequest request = FetchPlaceRequest.newInstance(placeId, placeFields);

    placesClient.fetchPlace(request).addOnSuccessListener(new OnSuccessListener<FetchPlaceResponse>() {
        @Override
        public void onSuccess(FetchPlaceResponse fetchPlaceResponse) {
            Place place = fetchPlaceResponse.getPlace();
            PlaceDataHolder holder = new PlaceDataHolder(place);
            String placeName = poi.name;
            makeLootFragment(holder,placeName);

启动的片段是单击 POI 的全部要点,因此如果是这种情况,我将需要考虑另一种处理冷却时间的方法..但我真的不明白为什么它会干扰。

标签: javaandroidgoogle-maps-android-api-2

解决方案


我对返回的 PointOfInterest 考虑得不够周到。每次发出请求时它都会附带一个 UUID,因为每次我单击它都会更改它,因此它作为键无用。这是通过将我的后期操作检查从确保它已进入 hashMap 更改为查看整个 hashMap 的内容,很快就看到尽管只单击一个 poi,条目仍在建立

解决这个问题很简单。我从 poi.name 创建了一个新的 String 变量并用它来代替 poi,必须更改 HashMap 以接受 String 而不是 PointOfInterest


推荐阅读