正确返回列表

时间:2016-11-07 14:02:10

标签: android xml list oop

如何正确返回列表?

我正在使用OSMdroid编写应用程序,我想使用变量"经度"和"纬度"该课程" Place"(在本帖子的底部)最终在" onPostExecute"中使用它们。方法,就在我设置" PLACEHOLDERS"。

的地方

Android Studio希望我改变行#34;返回loadXmlFromNetwork(urls [0]);",执行下面的代码,但我不知道究竟是怎么回事(以下方法属于同一类)。

private class DownloadXmlTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
        try {
            //Here I want to recieve the list
            return loadXmlFromNetwork(urls[0]);       
        } catch (IOException e) {
            return getResources().getString(R.string.connection_error);
        } catch (XmlPullParserException e) {
            return getResources().getString(R.string.xml_error);
        }

    }

    @Override
    protected void onPostExecute(List<Place> result) {

        MapView map = (MapView) findViewById(R.id.map);
        IMapController mapController = map.getController();
        mapController.setZoom(17);
        //Here I want to use the latitude and longitude variables of the List
        GeoPoint myLocation = new GeoPoint(PLACEHOLDER(latitude), PLACEHOLDER(longitude)); 
        mapController.animateTo(myLocation);

    }
}

这是我第一次收到名单的地方:

private List<Place> loadXmlFromNetwork(String urlString) throws XmlPullParserException, IOException {
    InputStream stream = null;  // Instantiate the parser
    XMLParser XMLParser = new XMLParser();
    List<Place> places = null; 

    try {
        stream = downloadUrl(urlString);
        places = XMLParser.parse(stream);  // Makes sure that the InputStream is closed after the app is finished using it.
    } finally {
        if (stream != null) {
            stream.close();
        }
    }

    return places;
}

这是我的地方课程:

public class Place {
    private String longitude;
    private String latitude;
    private String place_id;

    public String getLongitude() {
        return longitude;
    }
    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getLatitude() {
        return latitude;
    }
    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getPlace_id() {
        return place_id;
    }
    public void setPlace_id(String place_id) {this.place_id = place_id;}

    @Override
    public String toString() {
        return "ID: " + place_id + "\n" + "Longitude: " + longitude + "\n" + "Latitude: " + latitude;
}

2 个答案:

答案 0 :(得分:1)

AsyncTask的三种参数类型为AsyncTask<Params, Progress, Result>

(参见AsyncTask documentation

如果您希望获得List<Place>,则必须替换

private class DownloadXmlTask extends AsyncTask<String, Void, String> {

private class DownloadXmlTask extends AsyncTask<String, Void, List<Place>> {

您的doInBackground()方法必须返回List<Place>而不是String。然后您调用loadXmlFromNetwork(urls[0])的行将起作用,因为loadXmlFromNetwork()会返回List<Place>,但您的catches子句中的另外两个返回行不再编译,因为它们返回{{ 1}}。您必须更改它们,然后返回String,例如。

编辑:正如@ Code-Apprentice所说,不应该忽略该例外。你可以使用布尔标志来稍后检查它们。

null

答案 1 :(得分:0)

最简单的解决方法是更改​​

private class DownloadXmlTask extends AsyncTask<String, Void, String>

private class DownloadXmlTask extends AsyncTask<String, Void, List<Place>>

AsyncTask的最后一个参数是结果类型。您将需要一种不同的方式来传达错误情况。例如,您可以添加一些布尔字段作为标志和适当的gettters来访问它们。此外,AsyncTask不应对UI中显示的错误消息负责。这违反了单一责任原则。