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 谷歌地图、移动标记崩溃应用的主要内容,如果未能解决你的问题,请参考以下文章