如何正确返回列表?
我正在使用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;
}
答案 0 :(得分:1)
AsyncTask
的三种参数类型为AsyncTask<Params, Progress, Result>
如果您希望获得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中显示的错误消息负责。这违反了单一责任原则。