【问题标题】:java.lang.IllegalStateException: Not on the main thread Google Mapsjava.lang.IllegalStateException:不在谷歌地图的主线程上
【发布时间】:2017-01-12 21:23:15
【问题描述】:

当我的 Android 应用程序代码从云消息传递平台接收数据并尝试将该数据放在地图上时,我收到上述错误 -

    java.lang.IllegalStateException: Not on the main thread
    at maps.w.c.a(Unknown Source)
    at maps.y.F.a(Unknown Source)
    at maps.ad.u.b(Unknown Source)
    at vo.onTransact(:com.google.android.gms.DynamiteModulesB:92)
    at android.os.Binder.transact(Binder.java:380)
    at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.animateCamera(Unknown Source)
    at com.google.android.gms.maps.GoogleMap.animateCamera(Unknown Source)
    at com.pabba.mtracker.tracking.view.TrackingActivity.onLocationReceived(TrackingActivity.java:54)

以下是我的演示者(我在我的 android 应用程序中使用 MVP 模式)在收到来自云消息传递服务的位置消息时调用的代码。

@Override
public void onLocationReceived(LatLng latLng) {
    Log.i(TAG, latLng.toString());
    mGoogleMap.addPolyline(new PolylineOptions().add(latLng));
    mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder().target(latLng)
            .zoom(13).build()));
}

并且错误发生在 addPolyLine 函数调用中。 请告诉我可以做些什么来解决它。

【问题讨论】:

  • 在 UI 线程上运行

标签: android google-maps


【解决方案1】:

您必须在 UIThread 中运行此代码:

activity.runOnUIThread(new Runnable(){
    public void run(){
        mGoogleMap.addPolyline(new PolylineOptions().add(latLng));
        mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder().target(latLng)
        .zoom(13).build()));
    }
});

【讨论】:

  • 活动也在 UIThread 中运行,UI 上的任何更新都应该在 UIThread 中而不是任何其他线程中。
  • 如果此答案解决了您的问题,请将其标记为解决方案
【解决方案2】:

以下代码将对您有所帮助。添加您的活动。

runOnUiThread(new Runnable() {
   @Override
   public void run() {
      MapView mMapView = (MapView) dialog.findViewById(R.id.mapView);
      MapsInitializer.initialize(context);
      mMapView.onCreate(dialog.onSaveInstanceState());
      mMapView.onResume();
      mMapView.getMapAsync(new OnMapReadyCallback() {
      @Override
      public void onMapReady(final GoogleMap googleMap) {
            LatLng myLocation=new LatLng(Double.parseDouble(lat), Double.parseDouble(lon));
            googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
            googleMap.addMarker(new MarkerOptions().position(myLocation).title("My location").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
            float zoomLevel = (float) 16.0; //This goes up to 21
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myLocation, zoomLevel));  
            googleMap.getUiSettings().setZoomControlsEnabled(true);
         }
      });
   }
});

【讨论】:

  • 欢迎来到 Stack Overflow。请提供一些关于提供的代码和您的问题解决方案的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
相关资源
最近更新 更多