2017-08-17 5 views
0

Je suis relativement nouveau dans le développement Android et je crée une application qui utilise un fragment de carte Google. J'interroge l'API Google Directions et récupère des données JSON en utilisant une méthode AsyncTask. Je décode ensuite la polyligne et gagne à son tour un tableau de paires de LatLon. Je voudrais maintenant utiliser ce tableau de chaînes dans mon MainActivity. J'ai essayé beaucoup de manières de faire ceci, cependant chaque manière simple a rendu le tableau de chaîne nul.Android: String array devient NULL lorsque je le renvoie à MapsActivity d'une classe qui utilise une tâche asynchrone

Méthode essayée = 1) en utilisant un champ statique 2) en utilisant des objets Intent pour transférer des données 3) en créant une interface.

Quelqu'un pourrait me dire comment je devrais contourner cela et pourquoi il continue à devenir nul dans ma MainActivity? Des extraits de mon code sont ci-dessous, merci.

public class GetDirectionsData extends AsyncTask<Object, String, 
String> 
{ 
private GoogleMap mMap; 
private Context context; 
private String url , googleDirectionsData; 
private String distance,duration; 
private LatLng destinationLatLng; 
private String[] directionsList; 

public GetDirectionsData(Context context) 
{ 
    this.context = context; 
} 

@Override 
protected String doInBackground(Object... objects) 
{ 
    mMap = (GoogleMap)objects[0]; 
    url = (String)objects[1]; 
    destinationLatLng = (LatLng)objects[2]; 

    DownloadUrl downloadURL = new DownloadUrl(); 
    try 
    { 
     googleDirectionsData = downloadURL.readUrl(url); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    return googleDirectionsData; 
} 

@Override 
protected void onPostExecute(String s) 
{ 
    // uses other class DataParser to extract relevant JSONdata and 
    // displays polyline 
    DataParser directionParser = new DataParser(); 
    directionsList = directionParser.parseDirections(s); 
    displayDirection(directionsList); 
} 

public void displayDirection(String[] directionsList) 
{ 
    int count = directionsList.length; 

    for(int i = 0; i < count; i++) 
    { 
     PolylineOptions options = new PolylineOptions(); 
     options.color(Color.BLUE); 
     options.width(10); 
     options.addAll(PolyUtil.decode(directionsList[i])); // decode polylines 
     mMap.addPolyline(options); 
    } 
} 

Je veux maintenant passer directionsList tableau de chaînes Retour à MapsActivity ci-dessous

public class MapsActivity extends FragmentActivity 
{ 
public void onClick(View v) 
{ 
    Object directionDataTransfer[]; 

    // DIRECTIONS BUTTON 
    switch(v.getId()) 
    { 
     case R.id.IB_search: 
      directionDataTransfer = new Object[3]; 
      GetDirectionsData getDirectionsData = new GetDirectionsData(this); 

      String directionsUrl = getDirectionsUrl(); 
      directionDataTransfer[0] = mMap; 
      directionDataTransfer[1] = directionsUrl; 
      directionDataTransfer[2] = new LatLng(//destination LatLon) 
      getDirectionsData.execute(directionDataTransfer); 

      Toast.makeText(MapsActivity.this, "Fetching directions", Toast.LENGTH_LONG).show(); 

    } 
} 

private String getDirectionsUrl() 
{ 
    StringBuilder googleDirectionsUrl = new StringBuilder("https://maps.googleapis.com/maps/api/directions/json?"); 
    googleDirectionsUrl.append("origin=" + originLat + "," + originLon); 
    googleDirectionsUrl.append("&destination=" + destinationLat + "," + destinationLon); 
    googleDirectionsUrl.append("&mode=" + modeOfTransport); 
    googleDirectionsUrl.append("&waypoints=via:" + waypointsLat + "," + waypointsLon); 
    googleDirectionsUrl.append("&key=" + googleApiKey); 
    return(googleDirectionsUrl.toString()); 
} 
} 

Répondre

0

Voici un exemple de l'aide de l'interface - Espérons que cela aide.

DummyAsyncTask.java

import android.os.AsyncTask; 
public class DummyAsyncTask extends AsyncTask<Void, Void, String> { 

private DummyInterface mListener = null; 

DummyAsyncTask(DummyInterface listener) { 
    mListener = listener; 
} 

@Override 
protected String doInBackground(Void... voids) { 
    return s;  // return your string from doInBackground(it will be available as a parameter in onPostExecute()) 
} 

@Override 
protected void onPostExecute(String s) { 

    if(mListener != null) { 
     mListener.onCallback(s); // sending string s back to activity which registered for callback 
    } 
} 
} 

DummyInterface.java

public interface DummyInterface { 

    void onCallback(String s); // callback API 
} 

DummyActivity.java

import android.app.Activity; 
import android.os.Bundle; 

public class DummyActivity extends Activity implements DummyInterface{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    new DummyAsyncTask(this).execute(); 
} 

@Override 
public void onCallback(String s) { 
    System.out.println("String s = " + s); 
} 
}