【问题标题】:Android google maps v2 execute asynctask when user stops moving the camera当用户停止移动相机时,Android google maps v2 执行 asynctask
【发布时间】:2015-05-11 08:26:18
【问题描述】:

我正在制作一个使用 google maps api v2 的应用程序。我的问题是,当我注册相机更改侦听器时,它会在每次相机移动时执行,而不是在移动停止时执行。我想实现后者。如何修改我的代码以仅在移动站点时注册?

这是我的代码:

mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition position) {
                LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
                ne = bounds.northeast;
                sw = bounds.southwest;
                ne1 = ne.latitude;
                ne2 = ne.longitude;
                sw1 = sw.latitude;
                sw2 = sw.longitude;
                new DownloadJSON().execute();
            }
        });

【问题讨论】:

标签: android google-maps android-asynctask


【解决方案1】:

我实现了自定义计时器,仅在满足条件时才在特定时间后执行。这是我的代码:

mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
                @Override
                public void onCameraChange(CameraPosition position) {
                    LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
                    ne = bounds.northeast;
                    sw = bounds.southwest;
                    if(t!=null){
                        t.purge();
                        t.cancel();
                    }
                    t = new Timer();
                    t.schedule(new TimerTask() {
                        public void run() {
                            if(ne1 != ne.latitude && ne2 != ne.longitude && sw1 != sw.latitude && sw2 != sw.longitude){
                                ne1 = ne.latitude;
                                ne2 = ne.longitude;
                                sw1 = sw.latitude;
                                sw2 = sw.longitude;
                                Log.d("Tag","Refreshing data");
                                new DownloadJSON().execute();
                                t.cancel();
                            }
                            else{
                            ne1 = ne.latitude;
                            ne2 = ne.longitude;
                            sw1 = sw.latitude;
                            sw2 = sw.longitude;}
                            t.cancel(); // also just top the timer thread, otherwise, you may receive a crash report
                        }
                    }, 1000);
                    //new DownloadJSON().execute();
                }
            });

【讨论】:

    【解决方案2】:

    我认为你不能这样做“oncamerachange”在运动结束时触发一个事件,但可能会在运动过程中触发或不触发其他事件。

    谷歌文档: " 在 摄像机 位置 改变 后 调用 . 在 动画 过程 中 , 监听 者 可能 不会 收到 中间 摄像机 位置 的 通知 . 它 总是 被 调用 动画 中 的 结束 位置 . "

    并且没有监听器开始或结束摄像机移动。

    做类似事情的一种方法是保存最后一次加载 json 的点 ( latlang ),每次发生“oncamerachange”事件时,将当前点与前一点进行比较并决定是否是否要重新加载 json。

    已编辑以发布来自 google gmaps-api-issues 的解决方法。

    也许这就是您要寻找的东西。来自关于谷歌问题的讨论。

    https://code.google.com/p/gmaps-api-issues/issues/attachmentText?id=4636&aid=46360026000&name=sample_inner_listener.java&token=ABZ6GAdaQesCaWQ_IU8t9J222IBYzPceUA%3A1431366784956

    new GoogleMap.OnCameraChangeListener() {
        private static int CAMERA_MOVE_REACT_THRESHOLD_MS = 500;
        private long lastCallMs = Long.MIN_VALUE;
    
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
         final long snap = System.currentTimeMillis();
         if (lastCallMs + CAMERA_MOVE_REACT_THRESHOLD_MS > snap) {
           lastCallMs = snap;
           return;
         }
    
         ;; // here the actual call whatever you want to do on camera change
    
         lastCallMs = snap;
        }
    

    };

    作者评论:

    您好,我附上了一个匿名侦听器包装器实现的示例,您可以使用 CAMERA_MOVE_REACT_THRESHOLD_MS 来评估您的最佳价值,如果它还不够,您也可以添加一种自动感应,这会使该阈值适应onCameraChange() 调用频率

    【讨论】:

    • 我是这样想的,但问题是监听器也在运动过程中被触发。因此,我需要以某种方式用我的监听器覆盖该监听器。
    • 向 go​​ogle 报告了一个非常相似的问题:code.google.com/p/gmaps-api-issues/issues/detail?id=4636 尚无解决方案。在这种威胁中,有一些解决方法可能对您有用。
    • 有没有办法在那里放置一个计时器并仅在计时器用完时更新?
    • 您可以在 oncamerachange 上启动一个线程并在该线程中等待 x 毫秒。等待后,您可以在此线程中检查位置是否与等待前的位置发生了变化。如果它没有改变,那么运动就结束了。像这样的东西。不是一个非常干净的解决方案。
    • 你能给这里一些代码吗?里面有计时器,计时器用完后检查。但我需要弄清楚如何处理对计时器的下一次调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多