问题描述
我有一个应用程序,必须使用websockets实时更新google map上的标记。我成功完成了与Web套接字的连接,并在响应中得到了json字符串。我解析为JSONObject,当我调试时,我看到json中的所有数据都来了,但是问题是当我必须添加标记时。错误是:
e: "com.google.maps.api.android.lib6.common.apiexception.c: Not on the main thread"
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 (将#修改为@)