【问题标题】:Show location every 10 seconds in Android Studio在 Android Studio 中每 10 秒显示一次位置
【发布时间】:2019-09-28 08:11:41
【问题描述】:

我正在做一个应用程序,其中位置每 10 秒出现在地图上的不同位置,但不好的是它对我不起作用,当我运行程序时,我看到所有位置都已经到位.但我希望每 10 秒一个一个地放置,就好像它们在移动一样。 这是我的代码:

    @Override
    public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    for ( contador=1;contador<=10;contador++) {

            final long EXECUTION_TIME = 10000;
            handler.postDelayed(new Runnable() {

            @Override
            public void run() {

               handler.postDelayed(this, EXECUTION_TIME);
            }
        }, EXECUTION_TIME);

        mMap.addMarker(new MarkerOptions().position(obtenerLatLong(contador)).title("Mi Hogar").snippet("Municipio").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(obtenerLatLong(contador), 17));

    }
}

有什么办法吗?

【问题讨论】:

    标签: android google-maps location


    【解决方案1】:

    您的处理程序除了启动其他处理程序之外什么都不做,您必须在run() 内调用addMarkermoveCamera,并在run() 结束时启动下一个postDelayed。您可以使用 int 进行计数并查看您在循环中的位置,并仅在此 int 小于 10 时启动另一个处理程序。(这里我使用 cpt 来执行此操作)

    final long EXECUTION_TIME = 10000;
    final Handler handler = new Handler();
    
    handler.postDelayed(new Runnable() {
        int cpt = 1;
        @Override
        public void run() {
            /* old
            * mMap.addMarker(new MarkerOptions().position(obtenerLatLong(contador)).title("Mi Hogar").snippet("Municipio").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
            * mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(obtenerLatLong(contador), 17));
            */
            //new
            mMap.addMarker(new MarkerOptions().position(obtenerLatLong(cpt)).title("Mi Hogar").snippet("Municipio").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(obtenerLatLong(cpt), 17));
    
            cpt++;
            if(cpt <= 10)
                handler.postDelayed(this, EXECUTION_TIME);
        }
    }, EXECUTION_TIME);
    

    【讨论】:

    • 我把它和你一样,只留下一次。我试图把它放在一个while循环中,这样我就可以标记其余的但什么也不做。我要你拨 10 次,但只标记第一次
    • 我(我不确定你想要什么,如果你只想移动相机 10 次,只需将 addMarker 调用放在处理程序之外,顺便说一下我没有更新它但您可能希望我的cpt 变量为countador,所以当您调用obtenerLatLong() 时,它实际上是从1 循环到10
    • 是的,cpt 就像一个计数器,每转一圈都会在地图上显示一个新的标记。只是在添加 while 循环时,它会立即对我执行所有操作,就好像它不尊重每个标记的 10 秒时间。
    • 我编辑了我的代码以在任何地方使用cpt,试试吧,不要把它放在while循环中
    【解决方案2】:

    这将起作用尝试它:

    final long EXECUTION_TIME = 10000;
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
    int i=0;
      @Override
      public void run() {
        i=i+1;
        mMap.addMarker(new MarkerOptions().position(obtenerLatLong(contador)).title("Mi Hogar").snippet("Municipio").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(obtenerLatLong(contador), 17));
        if(i==10){
           handler.removeCallbacks(this);
        }
     }
    }, EXECUTION_TIME);
    

    【讨论】:

    • 但是我怎么知道我是否执行了 10 次?我认为需要一个循环,就像我在问题中一样。
    • int i=0; // 这被认为是循环执行了 10 次。
    • if(i==10) // 检查循环是否执行了 10 次,然后通过调用 -> handler.removeCallbacks(this); 删除循环;
    • 尝试根据您的情况进行更改,它会起作用。如果遇到任何问题,请告诉我。
    • 我把它和你一样,只留下一次。我试图把它放在一个while循环中,这样我就可以标记其余的但什么都不做。
    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多