[英]How to add custom Marker in Google maps besides onMapReady
I'm struggling with one question. 我正在努力解决一个问题。 How can I implement method in Google Maps Activity to add marker. 如何在Google Maps Activity中实现添加标记的方法。
I wanna to create method with two params (lat, lon) and in this place adding markers every time when my restfull client give me new data. 我想创建带有两个参数(纬度,经度)的方法,并在每次我restfull客户给我新数据时在此位置添加标记。
My problem is in fact that I wanna stay with MVC convention. 我的问题实际上是我想坚持使用MVC约定。 When I'm including retrofit controller into MapsActivity all works fine. 当我将改造控制器包括到MapsActivity中时,一切正常。
Problem begins when I send data from Controller to MapsActivity (Ends with NullPointerException). 当我从控制器向MapsActivity发送数据时,问题开始了(以NullPointerException结尾)。
MapsActivty: MapsActivty:
public class MapsActivity extends FragmentActivity implements
OnMapReadyCallback {
private GoogleMap mMap;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
public void onCarChangeLocation(Double lat, Double lon) {
LatLng carLatLng = new LatLng(lat, lon);
mMap.addMarker(new MarkerOptions().position(carLatLng).title("Integra Location"));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(carLatLng, 15.5f));
}
public Runnable getDataRunnable = new Runnable() {
@Override
public void run() {
Controller controller = new Controller();
controller.getData();
mHandler.postDelayed(this,1000);
}
};
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
getDataRunnable.run();
}
}
Controller: 控制器:
public class Controller {
public static final String BASE_URL = "server_ip";
private static Retrofit retrofit = null;
public Double lat;
public Double lon;
public void getData() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
Call<OutputModel> call = jsonPlaceHolderApi.getCords();
call.enqueue(new Callback<OutputModel>() {
@Override
public void onResponse(Call<OutputModel> call, retrofit2.Response<OutputModel> response) {
if (!response.isSuccessful()) {
// onFailTV.setText("Code: " + response.code());
return;
}
// mMap.clear();
lat = response.body().getLatitude();
lon = response.body().getLongitude();
MapsActivity mapsActivity = new MapsActivity();
mapsActivity.onCarChangeLocation(lat, lon);
}
@Override
public void onFailure(Call<OutputModel> call, Throwable t) {
}
});
}
}
Thanks for any reply. 感谢您的答复。
Update your MapsActivity code as bellow 在下面更新您的MapsActivity代码
public class MapsActivity extends FragmentActivity implements
OnMapReadyCallback {
private GoogleMap mMap;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
getDataRunnable.run();
}
LatLng carLatLng;
public void onCarChangeLocation(Double lat, Double lon) {
if (mMap != null) {//Check here map is not initialized
carLatLng = new LatLng(lat, lon);
mMap.addMarker(new MarkerOptions().position(carLatLng).title("Integra Location"));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(carLatLng, 15.5f));
} else {
carLatLng = new LatLng(lat, lon);
}
}
public Runnable getDataRunnable = new Runnable() {
@Override
public void run() {
Controller controller = new Controller();
controller.getData();
mHandler.postDelayed(this, 1000);
}
};
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
if (carLatLng != null) { //recall for setup pin
onCarChangeLocation(carLatLng.latitude, carLatLng.longitude);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.