使用网络套接字时,Android不在主线程中

问题描述

我有一个应用程序,必须使用websockets实时更新google map上的标记。我成功完成了与Web套接字的连接,并在响应中得到了json字符串。我解析为JSONObject,当我调试时,我看到json中的所有数据都来了,但是问题是当我必须添加标记时。错误是:

e: "com.google.maps.api.android.lib6.common.apiexception.c: Not on the main thread"

连接到websocket后,我执行了以下代码获取数据:

private OkHttpClient client;
    private EchoWebSocketListener webSocketListener;
    private static final int norMAL_CLOSURE_STATUS = 1000;

    public void startWebSocketConnection() {
        client = new OkHttpClient.Builder()
                .readTimeout(3000,TimeUnit.MILLISECONDS)
                .build();

        webSocketListener = new EchoWebSocketListener(new EchoWebSocketListener.socketClientListener() {

            @Override
            public void onConnected(WebSocket webSocket,okhttp3.Response response) {
                Log.d("Connected :",response.toString());
            }

            @Override
            public void getMessage(String message) {
                Log.d("Received",message);
                List<ClusterItem> clusterItems = new ArrayList<>();
                try {
                    JSONObject jsonObject = (JSONObject) new JSONTokener(message).nextValue();
                    //String vehicle_id = jsonObject.getString("id");
                    String vehicle_class = jsonObject.getString("vehicle_class");
                    String kemlercode = jsonObject.getString("kemlercode");
                    String vehicle_speed = jsonObject.getString("vehicle_speed");

                    JSONObject newJsonObject = jsonObject.getJSONObject("portalMetadata");
                    String portal_id = newJsonObject.getString("id");
                    String portalName = newJsonObject.getString("portalName");
                    String location = newJsonObject.getString("location");
                    String[] coordinates = location.split(",");
                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
                        double[] locations = Stream.of(coordinates).mapTodouble(Double::parseDouble).toArray();
                        double latitude = locations[0];
                        double longitude = locations[1];
                        MarkerOptions markerOptions = new MarkerOptions();
                        LatLng latLng = new LatLng(latitude,longitude);
                        markerOptions.position(latLng);

                        Marker marker = mGoogleMap.addMarker(markerOptions);
                        cameraConfigurations(latLng);

                        ClusterItem loc = new ClusterItem(latitude,longitude,vehicle_class,kemlercode);

                        marker.remove();
                        marker.showInfoWindow();
                        clusterItems.add(loc);
                        mClusterManager.addItem(loc);

                        mGoogleMap.setonMarkerClickListener(mClusterManager);
                        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,5.0f));
                        markers.add(marker);

                        setClusterManager(mClusterManager,clusterItems);
                        mGoogleMap.setonCameraIdleListener(mClusterManager);
                    }
                } catch (JSONException e) {
                    e.printstacktrace();
                }
            }

            @Override
            public void onFailure(WebSocket webSocket,String reason) {
                Log.d("Failure :",reason);
            }

            @Override
            public void closingOrClosed(boolean isClosed,WebSocket webSocket,String reason,int code) {
                Log.d("ClosingOrClosed :",isClosed ? "Closed" : "closing");
            }
        });

        Request request = new Request.Builder().url(SOCKET_URL).build();
        client.newWebSocket(request,webSocketListener);
    }

然后我在onCreate的runonuithread()中运行websocket,如下所示:

 runOnUiThread(this::startWebSocketConnection);

我正在使用okHttp库与websockets进行通信。 我在这里做错了。有没有人对我需要改进的任何建议。任何帮助将不胜感激。预先感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...