Android 使用 MapView 在 ViewGroup.removeAllViews() 上冻结
Android freezes on ViewGroup.removeAllViews() with MapView
我有一个动态创建的 com.google.android.gms.maps.MapView
,使用
mapView = new MapView(DataManager.getInstance().getContext());
此 mapView 通过 addView(mapView)
附加到父项。在我的程序后面的某个地方,我想通过调用 parent.removeAllViews();
来删除这个 mapView,但是 android 只是停滞了。该应用程序完全冻结,我不知道为什么。我该怎么做才能解决这个问题?
编辑:
我使用 CustomMapView
:
做了更多研究
import android.content.Context;
import android.view.View;
import com.google.android.gms.maps.MapView;
/**
* @author Daniël van den Berg
* @date 9/30/2015.
*/
public class CustomMapView extends MapView {
public CustomMapView(Context context) {
super(context);
}
@Override
public void onViewRemoved(View child) {
super.onViewRemoved(child);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
}
public void remove() {
onPause();
onDestroy();
}
}
我在尝试删除视图之前调用了删除方法,这就是它挂起的地方。 onPause 处的断点确实会被触发,但 onDestroy 处的断点不会。创建时,我同时调用 onCreate()
和 onResume()
。在不调用 onPause()
的情况下调用 onDestroy()
确实有效,但 removeView(child)
再次挂起。所以显然 onPause 挂了我的应用程序。有人知道我可以做什么来找出问题所在吗?
编辑:
另外,这个问题似乎只在地图从 public void onInfoWindowClick(final Marker marker) {
中删除时才会出现。在这个函数中我调用了通过 runOnUiThread()
.
删除视图的方法
好的,这个花了我一段时间,但我终于弄明白了。它似乎是一个错误或没有很好记录的东西。但显然从
调用 MapView.onPause()
@Override
public void onInfoWindowClick(final Marker marker) {
不起作用。这将挂起应用程序。我通过执行以下操作解决了这个问题:
@Override
public void onInfoWindowClick(final Marker marker) {
new Handler().postDelayed(
new Runnable() {
@Override
public void run() {
MainActivity.getInstance().runOnUiThread(
new Runnable() {
@Override
public void run() {
myMethods();
}
});
}
}, 1);
现在它工作得很好。我会将此作为错误报告给 Google (https://code.google.com/p/gmaps-api-issues/issues/detail?id=8681)。
我有一个动态创建的 com.google.android.gms.maps.MapView
,使用
mapView = new MapView(DataManager.getInstance().getContext());
此 mapView 通过 addView(mapView)
附加到父项。在我的程序后面的某个地方,我想通过调用 parent.removeAllViews();
来删除这个 mapView,但是 android 只是停滞了。该应用程序完全冻结,我不知道为什么。我该怎么做才能解决这个问题?
编辑:
我使用 CustomMapView
:
import android.content.Context;
import android.view.View;
import com.google.android.gms.maps.MapView;
/**
* @author Daniël van den Berg
* @date 9/30/2015.
*/
public class CustomMapView extends MapView {
public CustomMapView(Context context) {
super(context);
}
@Override
public void onViewRemoved(View child) {
super.onViewRemoved(child);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
}
public void remove() {
onPause();
onDestroy();
}
}
我在尝试删除视图之前调用了删除方法,这就是它挂起的地方。 onPause 处的断点确实会被触发,但 onDestroy 处的断点不会。创建时,我同时调用 onCreate()
和 onResume()
。在不调用 onPause()
的情况下调用 onDestroy()
确实有效,但 removeView(child)
再次挂起。所以显然 onPause 挂了我的应用程序。有人知道我可以做什么来找出问题所在吗?
编辑:
另外,这个问题似乎只在地图从 public void onInfoWindowClick(final Marker marker) {
中删除时才会出现。在这个函数中我调用了通过 runOnUiThread()
.
好的,这个花了我一段时间,但我终于弄明白了。它似乎是一个错误或没有很好记录的东西。但显然从
MapView.onPause()
@Override
public void onInfoWindowClick(final Marker marker) {
不起作用。这将挂起应用程序。我通过执行以下操作解决了这个问题:
@Override
public void onInfoWindowClick(final Marker marker) {
new Handler().postDelayed(
new Runnable() {
@Override
public void run() {
MainActivity.getInstance().runOnUiThread(
new Runnable() {
@Override
public void run() {
myMethods();
}
});
}
}, 1);
现在它工作得很好。我会将此作为错误报告给 Google (https://code.google.com/p/gmaps-api-issues/issues/detail?id=8681)。