protected void showPoiListView(boolean show) { Log.i(getClass().getSimpleName(), "showPoiListView: " + show ); mHandler.post(() -> { Log.e(MapBaseActivity.this.getClass().getSimpleName(), "run: " + show ); if (show) { mPoiListContainer.setVisibility(View.VISIBLE); } else { mPoiListContainer.setVisibility(View.GONE); //将所有Overlay 从地图上消除 if (poiOverlay != null) { poiOverlay.removeFromMap(); } } }); } 以上代码是在listview点击跳转到另一个Activity的时候调用,如 showPoiListView(false); 但是它会造成界面的右侧出现一个和listview宽高大小一样的黑屏,我把mHandler.post(() -> 这个给注释掉,黑屏就没了,这是什么情况?我解决的对吗?
时间: 2023-12-12 12:02:44 浏览: 71
这段代码中的 `mHandler.post(() -> {...})` 是用来将任务放入主线程的消息队列中,等待主线程空闲时执行。在你注释掉这个代码块后,`mPoiListContainer.setVisibility(View.VISIBLE)` 和 `mPoiListContainer.setVisibility(View.GONE)` 就直接在调用它的线程中执行了,而不是在主线程中执行。
由于 Android 中 UI 操作必须在主线程中执行,因此直接在非主线程中执行可能会导致一些问题,如你所遇到的黑屏问题。因此,正确的做法是使用 `runOnUiThread()` 方法或 `Handler` 将 UI 操作放到主线程中执行,而不是直接在非主线程中执行。
你可以尝试使用 `runOnUiThread()` 方法代替 `mHandler.post(() -> {...})`,如下所示:
```
protected void showPoiListView(boolean show) {
Log.i(getClass().getSimpleName(), "showPoiListView: " + show );
runOnUiThread(() -> {
Log.e(MapBaseActivity.this.getClass().getSimpleName(), "run: " + show );
if (show) {
mPoiListContainer.setVisibility(View.VISIBLE);
} else {
mPoiListContainer.setVisibility(View.GONE);
//将所有Overlay 从地图上消除
if (poiOverlay != null) {
poiOverlay.removeFromMap();
}
}
});
}
```
这样就可以避免直接在非主线程中执行 UI 操作导致的问题。
阅读全文