Использование OkHttp3 WebSocket с Retrofit для непрерывного отслеживания местоположения устройств android - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующий код java, который я хотел бы использовать в приложении android для запроса API-интерфейса для непрерывных изменений широты и долготы устройства, на котором выполняется клиентское приложение. Я хочу отслеживать устройство , Я считаю, что метод WebSocketCall, который я пытаюсь использовать, устарел. Из того, что я могу сказать, есть проблема с тем, как я пытаюсь использовать вызов webSocket для создания модифицированного клиента и помещения данных из WebSocketListner в модифицированное состояние. Я исследовал несколько примеров WebSocketListener и, будучи полным n00b, я не смог выяснить код. Моя идея состоит в том, чтобы держать соединение открытым для API через WebSocket и обрабатывать ответ данных с помощью модернизации. Любая помощь будет принята с благодарностью.

private WebSocketCall webSocket;

    private void createWebSocket() {
        final MainApplication application = (MainApplication) getActivity().getApplication();
        application.getServiceAsync(new MainApplication.GetServiceCallback() {
            @Override
            public void onServiceReady(final OkHttpClient client, final Retrofit retrofit, WebService service) {
                User user = application.getUser();
                map.moveCamera(CameraUpdateFactory.newLatLngZoom(
                        new LatLng(user.getLatitude(), user.getLongitude()), user.getZoom()));
                service.getDevices().enqueue(new WebServiceCallback<List<Device>>(getContext()) {
                    @Override
                    public void onSuccess(retrofit2.Response<List<Device>> response) {
                        for (Device device : response.body()) {
                            if (device != null) {
                                devices.put(device.getId(), device);
                            }
                        }

                        Request request = new Request.Builder().url(retrofit.baseUrl().url().toString() + "api/socket").build();
                        webSocket = WebSocketCall.create(client, request);
                        webSocket.enqueue(new WebSocketListener() {
                            @Override
                            public void onOpen(WebSocket webSocket, Response response) {
                            }

                            @Override
                            public void onFailure(IOException e, Response response) {
                                reconnectWebSocket();
                            }

                            @Override
                            public void onMessage(ResponseBody message) throws IOException {
                                final String data = message.string();
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        try {
                                            handleMessage(data);
                                        } catch (IOException e) {
                                            Log.w(MainFragment.class.getSimpleName(), e);
                                        }
                                    }
                                });
                            }

                            @Override
                            public void onClose(int code, String reason) {
                                reconnectWebSocket();
                            }
                        });
                    }
                });
            }

            @Override
            public boolean onFailure() {
                return false;
            }
        });
    }

1 Ответ

0 голосов
/ 30 апреля 2020

Итак, потому что я всего лишь n00b, потребовалось некоторое время и много вопросов, чтобы понять это. Может быть, это поможет кому-то еще в будущем.

 private WebSocket webSocket;

private void createWebSocket() {
        final MainApplication application = (MainApplication) getActivity().getApplication();
        application.getServiceAsync(new MainApplication.GetServiceCallback() {
            @Override
            public void onServiceReady(final OkHttpClient client, final Retrofit retrofit, WebService service) {
                User user = application.getUser();
                map.moveCamera(CameraUpdateFactory.newLatLngZoom(
                    new LatLng(user.getLatitude(), user.getLongitude()), user.getZoom()));

                service.getDevices().enqueue(new WebServiceCallback<List<Device>>(getContext()) {
                    @Override
                    public void onSuccess(retrofit2.Response<List<Device>> response) {
                        for (Device device : response.body()) {
                            if (device != null) {
                                devices.put(device.getId(), device);
                            }
                        }

                        Request request = new Request.Builder().url(retrofit.baseUrl().url().toString() + "api/socket").build();
                        Log.e("WebSockets", "Headers: " + request.headers().toString());
                        WebSocketListener webSocketListener = new WebSocketListener() {
                            private static final int NORMAL_CLOSURE_STATUS = 1000;
                            @Override
                            public void onOpen(WebSocket webSocket, Response response) {
                                webSocket.send("{Auth-Token:secret-api-token-here}");
                                Log.e("WebSockets", "Connection accepted!");
                            }

                            @Override
                            public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, @Nullable Response response) {
                                reconnectWebSocket();
                            }

                            @Override
                            public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) {
                                final String data = text;
                                Log.e("WebSockets", "Receiving : " + text);
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        try {
                                            handleMessage(data);
                                        } catch (IOException e) {
                                            Log.w(MainFragment.class.getSimpleName(), e);
                                        }
                                    }
                                });
                            }
                            @Override
                            public void onMessage(WebSocket webSocket, ByteString bytes) {
                                Log.e("WebSockets", "Receiving bytes : " + bytes.hex());
                            }

                            @Override
                            public void onClosing(WebSocket webSocket, int code, String reason) {
                                webSocket.close(NORMAL_CLOSURE_STATUS, null);
                                Log.e("WebSockets", "Closing : " + code + " / " + reason);
                            }

                            @Override
                            public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) {
                                reconnectWebSocket();
                            }
                        };

                        webSocket = client.newWebSocket(request, webSocketListener);
                    }
                });
            }

            @Override
            public boolean onFailure() {
                return false;
            }
        });
    }
...