【问题标题】:How do I Stop a running runOnUiThread Runnable如何停止正在运行的 runOnUiThread Runnable
【发布时间】:2019-08-28 20:09:06
【问题描述】:

我希望能够打开和关闭 MyLocationNewOverlay。我当前的代码是:-

    void btnTrack() {
        btnTrack = (Button) findViewById(R.id.btnStart);

        btnTrack.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            String btnText = btnTrack.getText().toString();
            GpsMyLocationProvider provider = new GpsMyLocationProvider(ctx);
            provider.addLocationSource(LocationManager.NETWORK_PROVIDER);
            // My Location Overlay
            MyLocationNewOverlay mysLocationoverlay = new MyLocationNewOverlay(provider, map);

            if (btnText.equalsIgnoreCase("Start")) {
                /**************************************************************************
                 *      Get and display the current location
                 **************************************************************************/

                getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

                mysLocationoverlay.enableMyLocation(); // not on by default
                mysLocationoverlay.setDirectionArrow(BitmapFactory.decodeResource(getResources(),
                        R.drawable.marker_node), BitmapFactory.decodeResource(getResources(), R.drawable.marker_poi_default));
                mysLocationoverlay.runOnFirstFix(new Runnable() {
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                btnTrack.setText("CANCEL");
                            }
                        });
                    }
                });

                map.getOverlays().add(mysLocationoverlay);
            }
            else {
                mysLocationoverlay.disableMyLocation();
                mysLocationoverlay.disableFollowLocation();
                map.getOverlays().remove(mysLocationoverlay);
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                btnTrack.setText("START");
            }
        }
    });
}

我很确定问题出在可运行对象上,但是当我将按钮切换到“取消”LED 时,我看不到任何终止它的方法。

我正在使用 osmdroid v6.1.0 和 osmbonuspack v6.6.0

如何停止可运行对象?

【问题讨论】:

  • runnable 应该不是问题。 Runnable by design 只运行一次。您也在使用 runOnFirstFix,因此应该没问题。我不确定问题到底出在哪里。尝试添加一些日志记录 (Log.d(...)) 和/或使用调试器查看代码是否正确执行。如果我不得不猜测,也许您需要在map.getOverlays().remove(..) 之后拨打map.invalidate()
  • @Josef - 感谢您的快速回复。但是,添加 map.invalidate() 不起作用。我将 map.getOverlays().remove(...) 包装在几个 Log 语句中,似乎删除失败,大概是因为 locationOverlay 仍然处于活动状态。这听起来是否可能是原因,如果是,我该如何解决?
  • 哦,现在我看到了问题所在。我会在一分钟内写一个适当的回复。

标签: runnable osmdroid osmbonuspack


【解决方案1】:

每次单击按钮时,您都会创建 MyLocationNewOverlay 的本地实例。

第一次单击按钮时,会创建、激活 MyLocationNewOverlay 实例并将其添加到地图视图中。

第二次单击按钮时,会创建另一个新的 MyLocationOverlay 实例。这个新实例被停用并从地图视图中删除 - 好吧,不是真的,因为它从未被激活或添加。

我建议在您的活动(或片段,取决于您的情况)中保留对 MyLocationOverlay 实例的引用,并仅在第一次单击按钮时创建它(检查是否为空)。

【讨论】:

  • 另外注意:你也不需要每次都创建GpsMyLocationProvider。
  • 是的!这就是答案 - 非常感谢。我删除了 setOnClickListener 上方的 GpsMyLocationProvider 和 MyLocationNewOverlay 行,以便在实例化按钮时实例化它们。那成功了。再次感谢您的帮助和建议。
猜你喜欢
  • 2013-09-11
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2011-04-16
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多