我使用google places api返回附近有趣的地方列表。每个位置及其属性都包含在result和/ result标记中。 遇到第一个/结果标记后,只要有parser.next()语句,我就会在主线程异常上获得网络。
try {
int type = parser.getEventType();
Locations obj = null;
while (type != XmlPullParser.END_DOCUMENT) {
String name = parser.getName();
switch (type) {
case XmlPullParser.START_TAG: {
if (name.equalsIgnoreCase("result"))
{obj = new Locations();}
else if (name.equalsIgnoreCase("name"))
obj.name = parser.nextText();
else if (name.equalsIgnoreCase("vicinity"))
obj.address = parser.nextText();
else if (name.equalsIgnoreCase("lat"))
lat = parser.nextText();
else if (name.equalsIgnoreCase("lng")) {
lng = parser.nextText();
LatLng latLng = new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
obj.latlng = latLng;
}
break;
}
case XmlPullParser.END_TAG: {
if (name.equalsIgnoreCase("result")) {
entries.add(obj);
}
break;
}
}//End Switch Case
type = parser.next();
}//End While Block
} //End try block
catch (IOException ioex)
{
ioex.printStackTrace();
}
catch (XmlPullParserException ioex)
{
ioex.printStackTrace();
}
catch (Exception ioex)
{
ioex.printStackTrace();
}
Locations类的每个对象代表一个地方。 我使用了一个单独的线程来执行httpurl连接活动,并且还将读取超时设置为3分钟。 (下面的类用于打开http网络连接)
public class DownloadxmlTask {
public String status=null;
public InputStream isi=null;
private InputStream loadXmlfromnetwork(String url) {
InputStream in = null;
try {
URL urlobj = new URL(url);
HttpURLConnection conobj = (HttpURLConnection) urlobj.openConnection();
conobj.setReadTimeout(3*60000);
in = conobj.getInputStream();
isi=in;
status = in.toString();
wait(3*60000);
conobj.disconnect();
} catch (Exception ex) {
status =ex.getLocalizedMessage().toString();
}
return in;
}
protected InputStream doInBackground(String params) {
final String url = params;
Thread newthread=new Thread() {
@Override
public void run() {
loadXmlfromnetwork(url);
}
};
newthread.start();
return isi;
}
}
答案 0 :(得分:0)
错误是不言自明的。您需要在UI主线程的单独线程内执行解析器调用。虽然有各种技术可以实现这一点,但最简单的方法是创建一个AsyncTask。
我已经粘贴了最简单的AsyncTask实现版本。 doInBackground()方法在其自己的单独线程上运行,而onPostExecute()在UI主线程上执行。
将所有解析器逻辑放在doInBackground()方法中。
private final AsyncTask<Void, Void, Void> cacheInitializationTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
//Runs on UI thread
super.onPostExecute(aVoid);
}
};
有关更多信息,请访问此链接 AsyncTask