Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我想从谷歌地图上的arrayList中每隔2秒添加一个标记_Java_Android_Google Maps_Android Asynctask_Handler - Fatal编程技术网

Java 我想从谷歌地图上的arrayList中每隔2秒添加一个标记

Java 我想从谷歌地图上的arrayList中每隔2秒添加一个标记,java,android,google-maps,android-asynctask,handler,Java,Android,Google Maps,Android Asynctask,Handler,实际上,我正在从ArrayList获取纬度和经度值,我想在地图上以3秒的间隔显示这些位置 我已经创建了一个名为waitSec()的方法,我正在displayLocation()中调用它,但这不起作用,因为它阻止了主线程,所以我使用了handler和asynctask,我发现了这方面的困难 public void waitSec(){ long start = System.currentTimeMillis(); while(System.currentTimeMillis()&

实际上,我正在从
ArrayList
获取
纬度
经度
值,我想在地图上以3秒的间隔显示这些位置

我已经创建了一个名为
waitSec()
的方法,我正在
displayLocation()
中调用它,但这不起作用,因为它阻止了主线程,所以我使用了
handler
asynctask
,我发现了这方面的困难

public void waitSec(){
    long start = System.currentTimeMillis();
    while(System.currentTimeMillis()<start+3000);
}

class MyAsyncTask extends AsyncTask<Integer,Integer,Void>{

    @Override
    protected Void doInBackground(Integer... integers) {

        waitSec();
        return null;
    }


    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Log.e("TAG", "onPostExecute: we have waited 3 seconds" );
        displayCurrentLocation();

    }
 }


private void displayCurrentLocation() {

    for(int i=0;i<trackObjectList.size();i++){

        //Log.e("TAG", "displayCurrentLocation:   "+trackObjectList.get(i).getLatitude() );

        if(trackObjectList.size()>0)
            latLng = new LatLng(Double.parseDouble(trackObjectList.get(i).getLatitude())
                ,Double.parseDouble(trackObjectList.get(i).getLongitude()));
        mMap.addMarker(new MarkerOptions().position(latLng)
                .title("Here")
                .icon(BitmapDescriptorFactory.fromBitmap(getSmallerSize(R.drawable.green_dot_th))));
        mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,15f));
        //waitSec();

    }
}
public void waitSec(){
长启动=System.currentTimeMillis();

while(System.currentTimeMillis()创建标记时需要设置标记的动画--

private void animateMarker(最终标记){
最终处理程序=新处理程序();
最终长启动时间=SystemClock.uptimeMillis();
最终长持续时间=300;//毫秒
Projection proj=mMap.getProjection();
最终车床标记LatLng=marker.getPosition();
点开始点=项目至筛选位置(标记标记);
起始点偏移量(0,-10);
最终LatLng StartAtlng=屏幕位置(起始点)的项目;
最终插值器插值器=新的反弹插值器();
handler.post(新的Runnable(){
@凌驾
公开募捐{
长时间运行=SystemClock.uptimeMillis()-startTime;
float t=interpolator.getInterpolation((float)经过时间/持续时间);
双液化天然气=t*标记经度+(1-t)*标记经度;
双纬度=t*标记纬度+(1-t)*标记纬度;
标记器设置位置(新板条(板条,板条));
如果(t<1.0){
//16毫秒后再次发布(60帧/秒)
handler.postDelayed(这是16);
}
}
});
}

displayCurrentLocation中有一个for循环,每次asyncTask.onPostExecute()运行时都会显示所有内容

请尝试以下操作:

private int objectsSize = trackObjectList.size()-1;//initialise this somewhere appropriate

private void displayCurrentLocation() 
{
    int i=objectsSize--;
    //Log.e("TAG", "displayCurrentLocation: "+trackObjectList.get(i).getLatitude() );

    if(i>=0)
    {
        latLng = new LatLng(Double.parseDouble(trackObjectList.get(i).getLatitude())
                ,Double.parseDouble(trackObjectList.get(i).getLongitude()));
        mMap.addMarker(new MarkerOptions().position(latLng)
                .title("Here")
                 .icon(BitmapDescriptorFactory.fromBitmap(getSmallerSize(R.drawable.green_dot_th))));
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,15f));
    }
}

您可以使用RxJava轻松实现这一点

  Observable.from(listOfItems)
                .zipWith(Observable.interval(2, TimeUnit.SECONDS), (item, notUsed) -> item)
                .subscribe(
                 // add marker addition logic here 
                        );

这是我第一次在这里发帖,如果我犯了任何错误,我很抱歉。我认为你需要在创建标记时使用动画。你可以简单地使用带有postDelayed方法的处理程序。不需要在asyntaski中使用任何复杂的代码。我使用一个没有任何动画的简单标记,但我希望我的标记在每次se后都显示在google地图上条件,这样它会自动创建一个标记路径。那么我正在检索latlang值的arraylist呢?
  Observable.from(listOfItems)
                .zipWith(Observable.interval(2, TimeUnit.SECONDS), (item, notUsed) -> item)
                .subscribe(
                 // add marker addition logic here 
                        );