Invoke one method from another

Viewed 122

I would like to invoke the private void addMarkers() method through the public void message() method. if anyone can help me, i would be grateful.I need to do this, because the message() method receives the latitudes, so I would like that every time it receives a message (with the latitude and longitude) it calls the addMarker() method so that it could be recreated however with the new Longitude Latitudes that were received in the message method. If someone can help me find another way to add a Maker and also its update, I will be accepting, from now on, grateful.

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 Answers

If you would like to refactor your code so that you get location data from message, you can do something like this. Without knowing what you are trying to do, it's hard to provide a solution.

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})
                            ));
                }
            });
}

Then in your message method, you can add markers by passing the style and location data as follows.

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

The logcat When I run the code

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

All these other errors that appear, do not interfere with the operation of the application, as these same errors appeared before I added Marker and the application worked normally

Related