Вызов одного метода из другого - PullRequest
2 голосов
/ 07 мая 2020

Я хотел бы вызвать метод private void addMarkers() через метод public void message(). Если кто-нибудь может мне помочь, я был бы благодарен. Мне нужно это сделать, потому что метод message() получает широты, поэтому я бы хотел, чтобы каждый раз, когда он получает сообщение (с широтой и долготой), он вызывает addMarker(), чтобы его можно было воссоздать, однако, с новыми значениями долготы и широты, которые были получены в методе сообщения. Если кто-то может помочь мне найти другой способ добавить Maker, а также его обновление, с этого момента я буду признателен.

My Code:

public void pubnubActions() {
        pubnub.addListener(new SubscribeCallback() {
            @Override
            public void status(PubNub pubnub, PNStatus status) {
                switch (status.getOperation()) {
                    // let's combine unsubscribe and subscribe handling for ease of use
                    case PNSubscribeOperation:
                    case PNUnsubscribeOperation:
                        // note: subscribe statuses never have traditional
                        // errors, they just have categories to represent the
                        // different issues or successes that occur as part of subscribe
                        switch (status.getCategory()) {
                            case PNConnectedCategory:
                                // this is expected for a subscribe, this means there is no error or issue whatsoever
                            case PNReconnectedCategory:
                                // this usually occurs if subscribe temporarily fails but reconnects. This means
                                // there was an error but there is no longer any issue
                            case PNDisconnectedCategory:
                                // this is the expected category for an unsubscribe. This means there
                                // was no error in unsubscribing from everything
                            case PNUnexpectedDisconnectCategory:
                                // this is usually an issue with the internet connection, this is an error, handle appropriately
                            case PNAccessDeniedCategory:
                                // this means that PAM does allow this client to subscribe to this
                                // channel and channel group configuration. This is another explicit error
                            default:
                                // More errors can be directly specified by creating explicit cases for other
                                // error categories of `PNStatusCategory` such as `PNTimeoutCategory` or `PNMalformedFilterExpressionCategory` or `PNDecryptionErrorCategory`
                        }

                    case PNHeartbeatOperation:
                        // heartbeat operations can in fact have errors, so it is important to check first for an error.
                        // For more information on how to configure heartbeat notifications through the status
                        // PNObjectEventListener callback, consult <link to the PNCONFIGURATION heartbeart config>
                        if (status.isError()) {
                            // There was an error with the heartbeat operation, handle here
                        } else {
                            // heartbeat operation was successful
                        }
                    default: {
                        // Encountered unknown status type
                    }
                }
            }

            @Override
            public void message(PubNub pubnub, PNMessageResult message) {
                String messagePublisher = message.getPublisher();
                System.out.println("Message publisher: " + messagePublisher);
                System.out.println("Message Payload: " + message.getMessage());
                System.out.println("Message Subscription: " + message.getSubscription());
                System.out.println("Message Channel: " + message.getChannel());
                System.out.println("Message timetoken: " + message.getTimetoken());

                JsonObject mensagem = (JsonObject)message.getMessage();
                String latitude = mensagem.get("lat").getAsString();
                String longitude = mensagem.get("lng").getAsString();
                String altitude = mensagem.get("alt").getAsString();

                Lat = Double.parseDouble(latitude);
                Lng = Double.parseDouble(longitude);
                alt = Double.parseDouble(altitude);

                System.out.println("A latitude recebida é igual: "+ latitude);
                System.out.println("A longitude recebida é igual: "+ longitude);
                System.out.println("A altura recebida é igual: "+ altitude);


            }

            @Override
            public void presence(PubNub pubnub, PNPresenceEventResult presence) {

            }

        });

        pubnub.subscribe()
                .channels(Arrays.asList("")) // subscribe to channels
                .execute();
    }


    public void onMapReady(@NonNull final MapboxMap mapboxMap) {
        Mapa.this.mapboxMap = mapboxMap;

        mapboxMap.setStyle(new Style.Builder().fromUri(""),
                new Style.OnStyleLoaded() {
                    @Override
                    public void onStyleLoaded(@NonNull Style style) {

                        enableLocationComponent(style);

                        style.addImage(MARKER_IMAGE, BitmapFactory.decodeResource(
                                Mapa.this.getResources(), R.drawable.automobile));
                        addMarkers(style);
                    }

                    private void addMarkers(@NonNull Style loadedMapStyle) {
                        List<Feature> features = new ArrayList<>();
                        features.add(Feature.fromGeometry(Point.fromLngLat(Lat, Lng)));

                        /* Source: A data source specifies the geographic coordinate where the image marker gets placed. */

                        loadedMapStyle.addSource(new GeoJsonSource(MARKER_SOURCE, FeatureCollection.fromFeatures(features)));

                        /* Style layer: A style layer ties together the source and image and specifies how they are displayed on the map. */
                        loadedMapStyle.addLayer(new SymbolLayer(MARKER_STYLE_LAYER, MARKER_SOURCE)
                                .withProperties(
                                        PropertyFactory.iconAllowOverlap(true),
                                        PropertyFactory.iconIgnorePlacement(true),
                                        PropertyFactory.iconImage(MARKER_IMAGE),
                                        // Adjust the second number of the Float array based on the height of your marker image.
                                        // This is because the bottom of the marker should be anchored to the coordinate point, rather
                                        // than the middle of the marker being the anchor point on the map.
                                        PropertyFactory.iconOffset(new Float[]{-10f, -0f})
                                ));
                    }
                });


    }

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

logcat Когда я запускаю код

05-08 22:37:33.129 8310-8401/com.example.wheresmybus E/AndroidRuntime: FATAL EXCEPTION: Subscription Manager Consumer Thread
    Process: com.example.wheresmybus, PID: 8310
    com.mapbox.mapboxsdk.exceptions.CalledFromWorkerThreadException: Mbgl-Source interactions should happen on the UI thread.
        at com.mapbox.mapboxsdk.utils.ThreadUtils.checkThread(ThreadUtils.java:43)
        at com.mapbox.mapboxsdk.style.sources.Source.checkThread(Source.java:45)
        at com.mapbox.mapboxsdk.style.sources.Source.<init>(Source.java:38)
        at com.mapbox.mapboxsdk.style.sources.GeoJsonSource.<init>(GeoJsonSource.java:187)
        at com.example.wheresmybus.Mapa.addMarkers(Mapa.java:226)
        at com.example.wheresmybus.Mapa.access$000(Mapa.java:65)
        at com.example.wheresmybus.Mapa$1.message(Mapa.java:181)
        at com.pubnub.api.managers.ListenerManager.announce(ListenerManager.java:45)
        at com.pubnub.api.workers.SubscribeMessageWorker.processIncomingPayload(SubscribeMessageWorker.java:197)
        at com.pubnub.api.workers.SubscribeMessageWorker.takeMessage(SubscribeMessageWorker.java:60)
        at com.pubnub.api.workers.SubscribeMessageWorker.run(SubscribeMessageWorker.java:51)
        at java.lang.Thread.run(Thread.java:818)

at com.example.wheresmybus.Mapa.addMarkers(Mapa.java:226) = loadedMapStyle.addSource(new GeoJsonSource(MARKER_SOURCE, FeatureCollection.fromFeatures(features)));

Все эти другие возникающие ошибки не мешают работе приложения, так как эти же ошибки появились до того, как я добавил Маркер, и приложение работало нормально

0 голосов
/ 07 мая 2020

Если вы хотите реорганизовать свой код, чтобы получать данные о местоположении из сообщения, вы можете сделать что-то вроде этого. Не зная, что вы пытаетесь сделать, трудно найти решение.

public void onMapReady(@NonNull final MapboxMap mapboxMap) {
        Mapa.this.mapboxMap = mapboxMap;

        mapboxMap.setStyle(new Style.Builder().fromUri(""),
                new Style.OnStyleLoaded() {
                    @Override
                    public void onStyleLoaded(@NonNull Style style) {

                        enableLocationComponent(style);

                        style.addImage(MARKER_IMAGE, BitmapFactory.decodeResource(
                                Mapa.this.getResources(), R.drawable.automobile));
                        mStyle = style;  //mStyle is class wide member variable 
                    }

    }

private void addMarkers(@NonNull Style loadedMapStyle, Lat lat, Lng lng) {
                    List<Feature> features = new ArrayList<>();
                    features.add(Feature.fromGeometry(Point.fromLngLat(lat, lng)));

                    /* Source: A data source specifies the geographic coordinate where the image marker gets placed. */

                    loadedMapStyle.addSource(new GeoJsonSource(MARKER_SOURCE, FeatureCollection.fromFeatures(features)));

                    /* Style layer: A style layer ties together the source and image and specifies how they are displayed on the map. */
                    loadedMapStyle.addLayer(new SymbolLayer(MARKER_STYLE_LAYER, MARKER_SOURCE)
                            .withProperties(
                                    PropertyFactory.iconAllowOverlap(true),
                                    PropertyFactory.iconIgnorePlacement(true),
                                    PropertyFactory.iconImage(MARKER_IMAGE),
                                    // Adjust the second number of the Float array based on the height of your marker image.
                                    // This is because the bottom of the marker should be anchored to the coordinate point, rather
                                    // than the middle of the marker being the anchor point on the map.
                                    PropertyFactory.iconOffset(new Float[]{-10f, -0f})
                            ));
                }
            });
}

Затем в методе сообщения вы можете добавить маркеры, передав данные стиля и местоположения следующим образом.

            Lat = Double.parseDouble(latitude);
            Lng = Double.parseDouble(longitude);
            alt = Double.parseDouble(altitude);
            addMarkers(mStyle, Lat, Lng);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...