从 Web 服务获取数据时强制关闭/崩溃
我在异步任务中使用以下代码,用于解析网络服务并在地图中显示结果(在 HTC 希望 s 中,真实设备)..
protected Void doInBackground(Void... params) {
try {
/** Handling XML */
spf = SAXParserFactory.newInstance();
sp = spf.newSAXParser();
xr = sp.getXMLReader();
String response = doGet("http://www.abc.com");
myXMLHandler = new MyXMLHandler();
xr.setContentHandler(myXMLHandler);
//xr.parse(new InputSource(sourceUrl.openStream()));
xr.parse(new InputSource(new StringReader(response)));
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (NullPointerException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
markerssList = MyXMLHandler.markerList;
mapOverlays_results =mapView.getOverlays();
mapOverlays_results.remove(itemizedOverlay);
if(markerssList.getLatitude().size()>0)
{
Drawable drawable = HSLoc_tabActivity.this.getResources().getDrawable(R.drawable.flag);
itemizedOverlay = new CustomItemizedOverlay(drawable, HSLoc_tabActivity.this);
for (int i = 0; i < markerssList.getLatitude().size(); i++) {
ss1 = markerssList.getLatitude().get(i);
ss2 = markerssList.getLongitude().get(i);
ss3 = markerssList.getName().get(i);
ss4 = markerssList.getAddress().get(i);
ss5 = markerssList.getCity().get(i);
markerssList.getPostal_code().get(i);
try
{
p = new GeoPoint((int) (Double.parseDouble(ss1) * 1E6),
(int) (Double.parseDouble(ss2) * 1E6));
overlayItem = new OverlayItem(p, " ",
""+ss3+"\n"+ss4+"\n"+ss5);
itemizedOverlay.addOverlay(overlayItem);
}
catch(NullPointerException e1)
{
}
}
mapOverlays_results.add(itemizedOverlay);
//mapView.getOverlays().add(itemizedOverlay);
mapController = mapView.getController();
mapController.animateTo(p);
mapController.setZoom(12);
mapView.postInvalidate();
}
代码工作正常..但在低网络应用程序强制关闭和我遇到以下错误:
01-02 13:41:29.222: WARN/System.err(6562): java.net.UnknownHostException: www.abc.com.au
01-02 13:41:29.222: WARN/System.err(6562): at java.net.InetAddress.lookupHostByName(InetAddress.java:509)
01-02 13:41:29.232: WARN/System.err(6562): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:297)
01-02 13:41:29.232: WARN/System.err(6562): at java.net.InetAddress.getAllByName(InetAddress.java:256)
01-02 13:41:29.232: WARN/System.err(6562): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
01-02 13:41:29.232: WARN/System.err(6562): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-02 13:41:29.232: WARN/System.err(6562): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-02 13:41:29.232: WARN/System.err(6562): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359
)
以及
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): FATAL EXCEPTION: AsyncTask #2
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): java.lang.RuntimeException: An error occured while executing doInBackground()
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at android.os.AsyncTask$3.done(AsyncTask.java:200)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.lang.Thread.run(Thread.java:1027)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): Caused by: java.lang.NullPointerException
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at com.app.LocatorApp.HSLoc_tabActivity$backgroundLoadResults.doInBackground(HSLoc_tabActivity.java:545)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at com.app.LocatorApp.HSLoc_tabActivity$backgroundLoadResults.doInBackground(HSLoc_tabActivity.java:1)
如何处理这些错误?
I am using the following code in Async-task ,for parsing a web-service and showing the results in the map (In HTC desire s ,real device)..
protected Void doInBackground(Void... params) {
try {
/** Handling XML */
spf = SAXParserFactory.newInstance();
sp = spf.newSAXParser();
xr = sp.getXMLReader();
String response = doGet("http://www.abc.com");
myXMLHandler = new MyXMLHandler();
xr.setContentHandler(myXMLHandler);
//xr.parse(new InputSource(sourceUrl.openStream()));
xr.parse(new InputSource(new StringReader(response)));
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (NullPointerException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
markerssList = MyXMLHandler.markerList;
mapOverlays_results =mapView.getOverlays();
mapOverlays_results.remove(itemizedOverlay);
if(markerssList.getLatitude().size()>0)
{
Drawable drawable = HSLoc_tabActivity.this.getResources().getDrawable(R.drawable.flag);
itemizedOverlay = new CustomItemizedOverlay(drawable, HSLoc_tabActivity.this);
for (int i = 0; i < markerssList.getLatitude().size(); i++) {
ss1 = markerssList.getLatitude().get(i);
ss2 = markerssList.getLongitude().get(i);
ss3 = markerssList.getName().get(i);
ss4 = markerssList.getAddress().get(i);
ss5 = markerssList.getCity().get(i);
markerssList.getPostal_code().get(i);
try
{
p = new GeoPoint((int) (Double.parseDouble(ss1) * 1E6),
(int) (Double.parseDouble(ss2) * 1E6));
overlayItem = new OverlayItem(p, " ",
""+ss3+"\n"+ss4+"\n"+ss5);
itemizedOverlay.addOverlay(overlayItem);
}
catch(NullPointerException e1)
{
}
}
mapOverlays_results.add(itemizedOverlay);
//mapView.getOverlays().add(itemizedOverlay);
mapController = mapView.getController();
mapController.animateTo(p);
mapController.setZoom(12);
mapView.postInvalidate();
}
code works fine..but in low network application force closed and i got he following error:
01-02 13:41:29.222: WARN/System.err(6562): java.net.UnknownHostException: www.abc.com.au
01-02 13:41:29.222: WARN/System.err(6562): at java.net.InetAddress.lookupHostByName(InetAddress.java:509)
01-02 13:41:29.232: WARN/System.err(6562): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:297)
01-02 13:41:29.232: WARN/System.err(6562): at java.net.InetAddress.getAllByName(InetAddress.java:256)
01-02 13:41:29.232: WARN/System.err(6562): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
01-02 13:41:29.232: WARN/System.err(6562): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-02 13:41:29.232: WARN/System.err(6562): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-02 13:41:29.232: WARN/System.err(6562): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359
)
and
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): FATAL EXCEPTION: AsyncTask #2
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): java.lang.RuntimeException: An error occured while executing doInBackground()
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at android.os.AsyncTask$3.done(AsyncTask.java:200)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at java.lang.Thread.run(Thread.java:1027)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): Caused by: java.lang.NullPointerException
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at com.app.LocatorApp.HSLoc_tabActivity$backgroundLoadResults.doInBackground(HSLoc_tabActivity.java:545)
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): at com.app.LocatorApp.HSLoc_tabActivity$backgroundLoadResults.doInBackground(HSLoc_tabActivity.java:1)
How to handle these errors?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

当建立连接时出现异常时,继续后台任务可能没有什么意义。您的 catch 块可能应该返回某种错误指示。相反,它们失败了,并且 doInBackground 继续执行,导致 NullPointerException。
When you get an exception when making the connection, there's probably very little point in continuing the background task. Your
catch
blocks should probably return some sort of error indication. Instead they fall through anddoInBackground
continues executing, causing the NullPointerException.