Android 谷歌地图、移动标记崩溃应用

Posted

技术标签:

【中文标题】Android 谷歌地图、移动标记崩溃应用【英文标题】:Android Google maps, Moving Marker crash application 【发布时间】:2019-12-18 07:29:25 【问题描述】:

这是代码“MapsActiity.java”:

package com.example.myapplicationgooglemaps;

import ...


public class MapsActivity extends FragmentActivity implements
        OnMapReadyCallback 

    private static GoogleMap mMap;
    private static Marker marker;

    private static int x = -34;
    private static int y = 151;

    private static LatLng NextPosition;

    @Override
    protected void onCreate(Bundle savedInstanceState) 


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    


    public void myTimer() 
        Timer t = new Timer();

        t.schedule(new TimerTask() 
            @Override
            public void run() 

                if (mMap != null) 

                    x = x + 1;
                    y = y + 1;

                    NextPosition = new LatLng(x, y);

                    marker.setPosition(NextPosition);
                    mMap.moveCamera(CameraUpdateFactory.newLatLng(NextPosition));
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(16f));

                
            


        , 2000, 1000);

    

/* 操作地图一旦可用。 当地图可以使用时触发此回调。 这是我们可以添加标记或线条、添加侦听器或移动相机的地方。在这种情况下, 我们只是在澳大利亚悉尼附近添加一个标记。 如果设备上未安装 Google Play 服务,则会提示用户安装 它在 SupportMapFragment 中。此方法只会在用户拥有 安装了 Google Play 服务并返回到应用程序。 */

    @Override
    public void onMapReady(GoogleMap googleMap) 
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng position = new LatLng(x, y);
        marker = mMap.addMarker(new MarkerOptions().position(position).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(position));

        myTimer();

    

tryes 执行此行时应用程序崩溃:

                    marker.setPosition(NextPosition);

谁能解释一下问题出在哪里? 谢谢!

【问题讨论】:

如果应用程序崩溃,你应该在某个地方有一个堆栈跟踪。将其添加到您的问题中。此外,根据Java Code Conventions 变量名称的节点应以小写字符开头。 E/BufferQueueProducer: [] 无法获得 hwsched 服务 D/mali_winsys: EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, egl_color_buffer_format *, EGLBoolean) 返回 0x3000 W/InputMethodManager : startInputReason = 5 I/zygote64:做完整的代码缓存收集,代码=117KB,数据=106KB I/zygote64:代码缓存收集后,代码=114KB,数据=72KB A/libc:致命信号11(SIGSEGV),代码1 , tid 21897 (Timer-0) 中的故障地址 0xc 与目标 VM 断开连接,地址:'localhost:8602',传输:'socket' A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xc in tid 21897 (Timer-0) 与目标 VM 断开连接,地址:'localhost:8602',传输:'插座' E/androidRuntime: FATAL EXCEPTION: Timer-0 Process: com.example.myapplicationgooglemaps, PID: 22668 com.google.maps.api.android.lib6.common.apiexception.d: 不在com.google.maps.api.android.lib6.common.lb(:com.google.android.gms.dynamite_mapsdynamite@18382051@18.3.82 (040408-​​260264002):6) 的主线程 您应该编辑您的问题并在那里添加stacktrace,而不是将其发布到 cmets 中。在 cmets 中很难阅读,但看起来并不完整? 【参考方案1】:

发生崩溃是因为您没有在 UIThread 中运行此代码。

您可以使用runOnUiThread 并实现第二个强制run() 方法,以便Runnable() 使用您的TimerTask。

尝试将myTimer() 中的代码替换为以下内容:

public void myTimer() 
    Timer t = new Timer();

    t.schedule(new TimerTask() 
        @Override
        public void run() 
            runOnUiThread(new Runnable() 

                @Override
                public void run () 
                    if (mMap != null) 

                        x = x + 1;
                        y = y + 1;

                        NextPosition = new LatLng(x, y);

                        marker.setPosition(NextPosition);
                        mMap.moveCamera(CameraUpdateFactory.newLatLng(NextPosition));
                        mMap.animateCamera(CameraUpdateFactory.zoomTo(16f));
                    
                
            );
        
    , 2000, 1000);

另见相关主题: java.lang.IllegalStateException: Not on the main thread Google Maps Android Add Map Marker Error: java.lang.IllegalStateException: Not on the main thread

希望这会有所帮助!

【讨论】:

以上是关于Android 谷歌地图、移动标记崩溃应用的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图标记(当前位置)使应用程序崩溃,如何解决?

在谷歌地图v2 android中移动标记

当标记向目的地移动时减少谷歌地图中的折线(Android)

从 web api 加载谷歌地图所需的标记,并在相机移动时动态加载其他标记

谷歌地图Android片段崩溃

沿着谷歌地图android中的路径动画汽车(标记)