Q:

update map marker position onLocationChanged() is not working

I'm working on google maps and I want to change map marker position when user location changed in onLocationChanged() method. I tried many solutions available on Stack overflow but none fits for me. 
I,ve tried Update marker position on google map smoothly and many others but failed.
I didn't find a proper way of code to update marker.
Thanks a lot!

here's my MapsActivity

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, TaskLoadedCallback {

    static Marker now;
    public static GoogleMap mMap;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_track_order);
        Log.i("map", "create");

        SupportMapFragment mapFragment1 = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        if (mapFragment1 != null) {
            mapFragment1.getMapAsync(this);
        }

        initViews();
        setToolbar()
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {

 mMap = googleMap;
        if (!runtime_permissions()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                Intent serviceIntent = new Intent(getApplicationContext(), MyService.class);
                ContextCompat.startForegroundService(getApplicationContext(), serviceIntent);
            } else {
                startService(new Intent(getApplicationContext(), MyService.class));
            }
        }

        mMap.addMarker(place1);
        mMap.addMarker(place2);

        CameraPosition googlePlex = CameraPosition.builder()
                .target(new LatLng(31.527653,74.455632))
                .zoom(7)
                .bearing(0)
                .tilt(45)
                .build();

        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(googlePlex), 5000, null);

}

here's my Service class

public class MyService  extends Service {

    public static LocationListener listener;
    public static LocationManager locationManager;
    private String locationAddress;

    @Override
    public void onCreate() {
        super.onCreate();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            startMyOwnForeground();
        else
            startForeground(1, new Notification());
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        listener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {

                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                String userAddress = address(latitude, longitude);

                 /*not working*/
                Marker myMarker = null;
                if(myMarker == null){
                  //  marker = mMap.addMarker(options);
                }
                else {
                    marker.setPosition(new LatLng(location.getLatitude(),location.getLongitude()));
                }

            }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {

            }

            @Override
            public void onProviderEnabled(String s) {

            }

            @Override
            public void onProviderDisabled(String s) {
                Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
            }

        };

        locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

        //noinspection MissingPermission
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        }
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, CommonObjects.DELAY_LOCATION_UPDATE, 0, listener);

        return START_STICKY;
    }
}

A:

After a lot of thinking I came to know that I can't update map marker in onLocationChanged(). Instead, I've to update my marker onMapReady() method.
By sending broadcast form my Service class to onMapReady() method, I got solution of the problem update map marker position onLocationChanged()
Updated code:

MyService.java

public class MyService  extends Service {

     ...   

    @Override
    public void onCreate() {
        super.onCreate();

      ...
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        listener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {

                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                String userAddress = address(latitude, longitude);

                 /*sending broadcast*/
                Intent i = new Intent("location_update");
                i.putExtra("latitude", latitude);
                i.putExtra("longitude", longitude);
                i.putExtra("address", userAddress);
                sendBroadcast(i);

            }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {

            }

            @Override
            public void onProviderEnabled(String s) {

            }

            @Override
            public void onProviderDisabled(String s) {
                ...
            }

        };

      ...
        return START_STICKY;
    }
}

MapsActivity.java

Also, here I'm starting Service in onCreate() rather than onMapReady().
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, TaskLoadedCallback {

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_track_order);

       ...

       /* staring service from here*/
       if (!runtime_permissions()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                Intent serviceIntent = new Intent(getApplicationContext(), MyService.class);
                ContextCompat.startForegroundService(getApplicationContext(), serviceIntent);
            } else {
                startService(new Intent(getApplicationContext(), MyService.class));
            }
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;
        place2 = new MarkerOptions().position(destination).title("Isl");
        mMap.addMarker(place2);

        /*receiving broadcast*/
        if (broadcastReceiver == null) {
            broadcastReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {

                    lat = (double) intent.getExtras().get("latitude");
                    lng = (double) intent.getExtras().get("longitude");
                    String  userAddress = (String) intent.getExtras().get("address");

                    place1 = new MarkerOptions().position(new LatLng(lat, lng)).title("Lahore");
                    mMap.addMarker(place1);
                }
            };
        }
        registerReceiver(broadcastReceiver, new IntentFilter("location_update"));

        CameraPosition googlePlex = CameraPosition.builder()
                .target(new LatLng(31.527653,74.455632))
                .zoom(7)
                .bearing(0)
                .tilt(45)
                .build();

        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(googlePlex), 5000, null);
      }
}

