我们正在使用高级SDK,并在后台线程上调用OnGestureListenerAdapter接口的OnTapEvent回调。它是SDK中的预期行为还是错误?
试图在文档中找到答案,但没有有关此行为的信息。
val state = MutableLiveData<MapViewState>()
override fun onTapEvent(point: PointF): Boolean {
viewModel.onMapClick()
return false
}
fun onMapClick() {
state.setValue(state.copy(selected = None))
}
尝试直接从onTapEvent设置LiveData值时出错。
java.lang.IllegalStateException: Cannot invoke setValue on a background thread
at androidx.lifecycle.LiveData.assertMainThread(LiveData.java:443)
at androidx.lifecycle.LiveData.setValue(LiveData.java:286)
at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
at com.example.MapFragment.onTapEvent(MapFragment.kt:121)
at com.nokia.maps.MapGestureHandlerBase.a(MapGestureHandlerBase.java:253)
at com.nokia.maps.MapGestureHandlerBase.a(MapGestureHandlerBase.java:230)
at com.nokia.maps.NmaaGestureHandler.handleTap(NmaaGestureHandler.java:230)
at com.nokia.maps.NmaaGestureHandler.pollNative(Native Method)
at com.nokia.maps.NmaaGestureHandler.a(NmaaGestureHandler.java:26)
at com.nokia.maps.NmaaGestureHandler$a.d(NmaaGestureHandler.java:379)
at com.nokia.maps.NmaaGestureHandler$a.c(NmaaGestureHandler.java:371)
at com.nokia.maps.NmaaGestureHandler$a.a(NmaaGestureHandler.java:363)
at com.nokia.maps.NmaaGestureHandler$a$1.a(NmaaGestureHandler.java:390)
at com.nokia.maps.NmaaGestureHandler$b.run(NmaaGestureHandler.java:429)
似乎在主线程上调用此回调的逻辑。
答案 0 :(得分:0)
快速答案是:避免ANR。 SDK用户可能会编写繁重的代码,这将导致应用程序无法响应。 有两种方法可以解决此问题:
1)将操作发布到UI线程,如下所示:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// customer code
}
});
2)使用异步侦听器,该侦听器在UI线程上调用。您必须使用“ false”值作为第三个参数来注册手势侦听器:
m_mapGesture.addOnGestureListener(gestureListener, 0, false);
希望这会有所帮助!