Ich verwende Google Maps, um einige Markierungen anzuzeigen. Die Marker werden von einer Datenbank heruntergeladen und gleichzeitig bekomme ich die Distanzmatrix von Google API, zwischen der aktuellen Position des Benutzers und dem Marker, den ich von der Datenbank bekomme.Meine UI ist mit AsyncTask mit Entfernungsmatrix und Google Maps blockiert
Mein Problem ist, dass ich dies mit .get tun, mein ui bloking (ich habe gelesen, dass .get die ui blockiert:
dataFromAsyncTask = testAsyncTask.get();
Nun, ich versuche, das gleiche zu tun, ohne zu blockieren die ui, aber ich bin nicht in der gleichen Zeit erhalten werden kann, oder in einem guten Weg, der Abstand zu diesem Marker.
ich etwas Hilfe schätzen, bitte.
Dies ist mein Code mit meinem alt und falsch .get:
for (City city : listCity.getData()) {
geoPoint = city.getLocation();
nameBeach = city.getName();
if (geoPoint == null) {
} else {
latitude = String.valueOf(geoPoint.getLatitude());
longitude = String.valueOf(geoPoint.getLongitude());
startRetrievenDistanceAndDuration();
try {
dataFromAsyncTask = testAsyncTask.get();
} catch (InterruptedException i) {
} catch (ExecutionException e) {
}
mMap.addMarker(new MarkerOptions().position(new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude()))
.title(nameCity)
.snippet(dataFromAsyncTask)
.icon(BitmapDescriptorFactory.defaultMarker()));
}
}
startRetrievenDistanceAndDuration Methode:
private void startRetrievenDistanceAndDuration() {
final String url;
testAsyncTask = new DistanceBetweenLocations(new FragmentCallback() {
@Override
public void onTaskDone(String result) {
}
});
url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + currentLatitude + "," + currentlongitude + "&destinations=" + latitude + "," + longitude + "&key=xxx";
testAsyncTask.execute(new String[]{url});
}
public interface FragmentCallback {
public void onTaskDone(String result);
AsyncTask Klasse:
@Override
protected String doInBackground(String... params) {
HttpURLConnection urlConnection = null;
URL url = null;
StringBuilder result = null;
String duration = "";
String distance = "";
try {
url=new URL(params[0]);
}catch (MalformedURLException m){
}
try {
urlConnection = (HttpURLConnection) url.openConnection();
}catch (IOException e){}
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
result = new StringBuilder();
String line;
while((line = reader.readLine()) != null) {
result.append(line);
}
}catch (IOException e){
} finally {
urlConnection.disconnect();
}
try {
JSONObject jsonObject = new JSONObject(result.toString());
JSONArray jsonArray = jsonObject.getJSONArray("rows");
JSONObject object_rows = jsonArray.getJSONObject(0);
JSONArray jsonArrayElements = object_rows.getJSONArray("elements");
JSONObject object_elements = jsonArrayElements.getJSONObject(0);
JSONObject object_duration = object_elements.getJSONObject("duration");
JSONObject object_distance = object_elements.getJSONObject("distance");
duration = object_duration.getString("text");
distance = object_distance.getString("text");
} catch (JSONException e) {
e.printStackTrace();
}
return distance + ", " + duration;
}
@Override
protected void onPostExecute(String result) {
mFragmentCallback.onTaskDone(result);
}
}
Ich versuche, dies zu tun, aber ich zeige nur die letzte Markierung auf meiner Liste:
Anruf in die Schleife die Methode:
startRetrievenDistanceAndDuration();
Und in onTaskDone versuchen, den Marker zu setzen, aber nur die letzte Markierung auf meiner Liste
@Override
public void onTaskDone(String result) {
mMap.addMarker(new MarkerOptions().position(new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude()))
.title(nameBeach)
.snippet(result)
.icon(BitmapDescriptorFactory.defaultMarker()));
}
AKTUALISIERT nach Änderungen erhalten: (nicht funktionieren noch) ich die Daten in AsyncTask analysieren kann und senden es in OnPostExecute, aber ich bekomme nur einen Wert, und nicht die 9 Werte, die ich habe ....
HAUPTTÄTIGKEIT:
DistanceBetweenLocations task = new DistanceBetweenLocations(mlatituDouble, mlongitudeDouble){
@Override
protected void onPostExecute(HashMap<String, String> result) {
super.onPostExecute(result);
String name = result.get("beachName");
String distance = result.get("distance");
String duration = result.get("duration");
String latitue = result.get("latitude");
String longitude = result.get("longitude");
Double mlatituDouble = Double.parseDouble(latitue);
Double mlongitudeDouble = Double.parseDouble(longitude);
if (mMap == null) {
mMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.mapView))
.getMap();
Toast.makeText(getActivity(), "mMap NO null", Toast.LENGTH_SHORT).show();
mMap.addMarker(new MarkerOptions().position(new LatLng(mlatituDouble, mlongitudeDouble))
.title(name)
.snippet(distance + " " + duration)
.icon(BitmapDescriptorFactory.defaultMarker()));
}
}
};
task.execute();
AsyncTask CLASS :.
public class DistanceBetweenLocations extends AsyncTask<String, String, HashMap<String, String>> {
Double currentLatitude;
Double currentlongitude;
public BeachMap beachMap;
public BackendlessCollection<Beach> dataBeach;
public GoogleMap mMap;
String latitude;
String longitude;
HashMap<String, String> map;
public DistanceBetweenLocations(Double currentLatitude, Double currentlongitude){
this.currentLatitude = currentLatitude;
this.currentlongitude = currentlongitude;
}
@Override
protected HashMap<String, String> doInBackground(String... params) {
dataBeach = beachMap.listBeach;
for (Beach city : dataBeach.getData()) {
GeoPoint geoPoint = city.getLocation();
String nameBeach = city.getName();
if (geoPoint == null) {
} else {
latitude = String.valueOf(geoPoint.getLatitude());
longitude = String.valueOf(geoPoint.getLongitude());
HttpURLConnection urlConnection = null;
URL url = null;
StringBuilder result = null;
String duration = "";
String distance = "";
try {
url = new URL("https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + currentLatitude + "," + currentlongitude + "&destinations=" + latitude + "," + longitude + "&key=xxxx");
} catch (MalformedURLException m) {
}
try {
urlConnection = (HttpURLConnection) url.openConnection();
} catch (IOException e) {
}
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
} catch (IOException e) {
} finally {
urlConnection.disconnect();
}
try {
JSONObject jsonObject = new JSONObject(result.toString());
JSONArray jsonArray = jsonObject.getJSONArray("rows");
JSONObject object_rows = jsonArray.getJSONObject(0);
JSONArray jsonArrayElements = object_rows.getJSONArray("elements");
JSONObject object_elements = jsonArrayElements.getJSONObject(0);
JSONObject object_duration = object_elements.getJSONObject("duration");
JSONObject object_distance = object_elements.getJSONObject("distance");
duration = object_duration.getString("text");
distance = object_distance.getString("text");
map = new HashMap<String, String>();
map.put("beachName", nameBeach);
map.put("distance", distance);
map.put("duration", duration);
map.put("latitude", latitude);
map.put("longitude", longitude);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
return map;
}
}
Danke für Ihre Antwort. Hab Sinn! Aber ich habe ein Problem mit Ihrem Code. Kann die Asynctask-Klasse ein GoogleMap-Objekt zurückgeben (um eine Markierung hinzuzufügen, die ich brauche, um ein Gmap-Objekt zu erzeugen) bekomme ich diesen Fehler bei der Rückkehr von doinbackground: erforderlich 'String' gegründet 'com.android ... GoogleMap'. Gleiches Problem in super.onPostExecute (markers); Danke – Simpson
Eine Frage mehr, innerhalb von onPostExecute (GoogleMaps Marker) muss ich keinen Code mehr hinzufügen? Wird angenommen, dass wenn die Aufgabe diese Methode beendet, der Marker in die Karte gesetzt wird? – Simpson
@Simpson Ich denke, dass das erste Problem, das Sie erwähnt haben, verursacht wird, weil Sie die Klasse nicht als öffentliche Klasse deklariert haben. Task extends AsyncTask ', wahrscheinlich haben Sie die öffentliche Klasse Task extends AsyncTask verwendet String, Void, String> '. –
Titus