【问题标题】:Android: String array becomes null when I pass it back to MapsActivity from a class which uses an async taskAndroid:当我从使用异步任务的类将字符串数组传递回 MapsActivity 时,字符串数组变为空
【发布时间】:2017-08-17 18:29:24
【问题描述】:

我对 Android 开发相当陌生,正在创建一个使用 Google 地图片段的应用程序。我正在查询 Google Directions Api 并使用 AsyncTask 方法检索 JSON 数据。然后我对折线进行解码,然后获得一个 LatLon 对的字符串数组。我现在想在我的 MainActivity 中使用这个字符串数组。我尝试了很多方法来做到这一点,但是每一种方法都使字符串数组为空。

方法尝试 = 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() );
}
}

【问题讨论】:

    标签: java android arrays json android-asynctask


    【解决方案1】:

    这是使用接口的示例之一 - 希望对您有所帮助。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多