为什么在后台线程上调用OnGestureListenerAdapter的onTapEvent方法?

时间:2019-06-14 10:02:53

标签: here-api

我们正在使用高级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)

似乎在主线程上调用此回调的逻辑。

1 个答案:

答案 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);

希望这会有所帮助!