2017-08-17 11 views
0

我是相當新的Android開發和正在創建它採用了谷歌地圖片段的應用程序類字符串數組變爲零。我正在查詢Google Directions Api並使用AsyncTask方法檢索JSON數據。然後我解碼多段線,然後獲得LatLon對的字符串數組。我現在想要在我的MainActivity中使用這個字符串數組。我已經嘗試了許多方法可以做到這一點,但是每一個方法已經取得字符串數組空。安卓:當我通過它回到MapsActivity從使用異步任務

方法try = 1)使用靜態字段2)使用Intent對象傳輸數據3)創建一個接口。

可能有人請告訴我,以我應該怎麼去解決這個,爲什麼它一直在我的MainActivity成爲空?我的代碼片段如下,謝謝。

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

我現在想通過directionsList字符串數組回MapsActivity下面

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

回答

0

下面是一個使用界面的例子之一 - 希望這有助於。

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