我的函数 get Nearby Restaurant 未被调用以在 Google Map 上放置标记

Posted

技术标签:

【中文标题】我的函数 get Nearby Restaurant 未被调用以在 Google Map 上放置标记【英文标题】:My function getNearbyRestaurant is not called to place markers on GoogleMap 【发布时间】:2020-07-28 15:46:43 【问题描述】:
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.google_map);


    restaurantNearbyRef = FirebaseDatabase.getInstance().getReference().child("Restaurant").child("Info");
    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);


    fetchLastLocation();
    getNearbyRestaurant();





private ArrayList<Marker> restaurantMarker = new ArrayList<>();

private void fetchLastLocation() 

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) 
        ActivityCompat.requestPermissions(this, new String[]
                Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_CODE);
        return;
    
    Task<Location> task = fusedLocationProviderClient.getLastLocation();
    task.addOnSuccessListener(new OnSuccessListener<Location>() 
        @Override
        public void onSuccess(Location location) 
            if (location != null) 

                mCurrentLocation = location;
                Toast.makeText(getApplicationContext(), mCurrentLocation.getLatitude()
                        + "" + mCurrentLocation.getLongitude(), Toast.LENGTH_SHORT).show();
                SupportMapFragment supportMapFragment = (SupportMapFragment)
                        getSupportFragmentManager().findFragmentById(R.id.google_map);
                supportMapFragment.getMapAsync(MapActivity.this);

                latitude = mCurrentLocation.getLatitude();
                longitude = mCurrentLocation.getLongitude();

                Log.d(TAG, "The latitude is " + latitude + " and the longitude is " + longitude);
            

        

    );




public void getNearbyRestaurant()
    if (restaurantMarker != null) 
        for (Marker marker : restaurantMarker) 
            marker.remove();
        
    

    GeoFire geoFire = new GeoFire(restaurantNearbyRef);

    GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude,longitude),radius);
    geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() 
        @Override
        public void onKeyEntered(String key, GeoLocation location) 
            restaurantMarker
                    .add(mMap.addMarker(new MarkerOptions().title("Restaurant").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
                            .position(new LatLng(location.latitude, location.longitude))));

            Log.d(TAG,"The getNearbyRestaurant latitude is " + latitude + "and the longitude is " +longitude );
        

        @Override
        public void onKeyExited(String key) 

        

        @Override
        public void onKeyMoved(String key, GeoLocation location) 

        

        @Override
        public void onGeoQueryReady() 

        

        @Override
        public void onGeoQueryError(DatabaseError error) 

        
    );

我的函数 getNearbyRestaurant 没有被调用。我不确定为什么?我试图放置在不同的位置,但没有打电话。希望任何人都可以提供帮助。我正在尝试显示我当前位置附近的附近餐厅列表。我可能错过了一些东西。希望任何人都可以提供帮助,因为在获取附近位置时没有太多资源。我看过更多有关网约车服务的影片

【问题讨论】:

你能检查一下logcat吗? 没有错误。 fetchLastLocation 有效,但其他功能无效 你能在onGeoQueryError() 做一个日志吗?检查是否捕获错误 getNearbyRestaurant() 函数没有被调用,我无法从 onGeoQueryError 获取 logcat 在那个方法里面,有很多代码。尝试逐个检查 1 【参考方案1】:

fetchLastLocationgetNearbyRestaurant 都异步加载数据。如果您在调试器中运行代码,或添加一些日志记录,您会看到在 GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude,longitude),radius) 运行时,latitude = mCurrentLocation.getLatitude() 行尚未运行。

从 Firebase 异步加载数据,从 android 操作系统异步检索位置。您的 Android 应用程序的主线程不会等待该数据或位置可用。因此,任何需要位置或数据的代码都需要在相关回调中,或者从那里调用。

最简单的解决方法是从onSuccess 内部调用getNearbyRestaurant

Task<Location> task = fusedLocationProviderClient.getLastLocation();
task.addOnSuccessListener(new OnSuccessListener<Location>() 
    @Override
    public void onSuccess(Location location) 
        if (location != null) 

            mCurrentLocation = location;
            Toast.makeText(getApplicationContext(), mCurrentLocation.getLatitude()
                    + "" + mCurrentLocation.getLongitude(), Toast.LENGTH_SHORT).show();
            SupportMapFragment supportMapFragment = (SupportMapFragment)
                    getSupportFragmentManager().findFragmentById(R.id.google_map);
            supportMapFragment.getMapAsync(MapActivity.this);

            latitude = mCurrentLocation.getLatitude();
            longitude = mCurrentLocation.getLongitude();

            Log.d(TAG, "The latitude is " + latitude + " and the longitude is " + longitude);

            getNearbyRestaurant();
        

我强烈建议阅读异步 API,因为几乎所有现代云或基于 I/O 的 API 的工作方式都是相同的。

见:

getContactsFromFirebase() method return an empty list,它还展示了如何进行自定义回调,然后您可以将其传递给 fetchLastLocation

【讨论】:

嗨弗兰克,我试过你的方法,但似乎没有调用 getNearbyRestaurant() 这意味着你是整个onSuccess 没有被调用。不过,交互式调试器通过 Stack Overflow 确实效率低下。最好自己调试代码,在所有行设置断点,然后看看有什么不符合您的预期。

以上是关于我的函数 get Nearby Restaurant 未被调用以在 Google Map 上放置标记的主要内容,如果未能解决你的问题,请参考以下文章

iOS 后台扫描上的 Google Nearby API

Nearby Bicycles

使用Nearby Connections API进行音频流式传输

Google nearBy BLE 后台订阅仅适用于事件屏幕

Google Nearby 中的传入文件有效负载感知和 onPayloadTransferUpdate 频率

[BZOJ2591][Usaco 2012 Feb]Nearby Cows