我正在尝试使用AndroidHttpClient下载一个CSV文件。由于某种原因,它在行"HttpResponse response httpClient.execute(httpGet, localContext);中失败,只需转到"finally"。
我在浏览器中检查了URL --它运行良好。
我没有从HttpResponse响应中获得任何信息--它只是简单地跳过了它。
我不明白为什么。有什么想法吗?
谢谢D
private ArrayList<String> retrieveStockFinParamsFromYahooApiUri(String yahooApiCall)
{
ArrayList<String> stockFinParamsFromYahooApiUriRows = new ArrayList<String>();
String resultLine = "";
BufferedReader reader = null;
AndroidHttpClient httpClient = AndroidHttpClient.newInstance("yahooGetStockParams");
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet(yahooApiCall);
try
{
HttpResponse response = httpClient.execute(httpGet, localContext);
reader = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
while ((resultLine = reader.readLine()) != null)
{
stockFinParamsFromYahooApiUriRows.add(resultLine);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (reader != null)
{
try
{
reader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return stockFinParamsFromYahooApiUriRows;
}进一步调查(05.22.2012):
@Snicolas -谢谢你的评论。在阅读了您的评论之后,我认为问题可能源于我使用模拟器而不是实际的设备来调试这个问题。我想模拟器可能会遇到一些连接问题。当我在我的设备上测试它时-我注意到问题仍然发生-所以这不是问题。
因此,我按照您的建议将代码更改为catch (Throwable e),并获得了以下堆栈快照:
05-22 18:17:41.457: W/System.err(24552): android.os.NetworkOnMainThreadException
05-22 18:17:41.461: W/System.err(24552): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
05-22 18:17:41.461: W/System.err(24552): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
05-22 18:17:41.461: W/System.err(24552): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
05-22 18:17:41.465: W/System.err(24552): at java.net.InetAddress.getAllByName(InetAddress.java:220)
05-22 18:17:41.465: W/System.err(24552): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
05-22 18:17:41.465: W/System.err(24552): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
05-22 18:17:41.468: W/System.err(24552): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
05-22 18:17:41.468: W/System.err(24552): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
05-22 18:17:41.468: W/System.err(24552): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
05-22 18:17:41.472: W/System.err(24552): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
05-22 18:17:41.472: W/System.err(24552): at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:257)
05-22 18:17:41.472: W/System.err(24552): at com.bewildering.app.StournamentDbAdapter$YahooStocksParams.retrieveStockFinParamsFromYahooApiUri(StournamentDbAdapter.java:1536)
05-22 18:17:41.476: W/System.err(24552): at com.bewildering.app.StournamentDbAdapter$YahooStocksParams.run(StournamentDbAdapter.java:1709)
05-22 18:17:41.476: W/System.err(24552): at com.bewildering.app.StournamentActivity.onCreate(StournamentActivity.java:65)
05-22 18:17:41.476: W/System.err(24552): at android.app.Activity.performCreate(Activity.java:4465)
05-22 18:17:41.476: W/System.err(24552): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-22 18:17:41.480: W/System.err(24552): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-22 18:17:41.480: W/System.err(24552): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
05-22 18:17:41.480: W/System.err(24552): at android.app.ActivityThread.access$600(ActivityThread.java:123)
05-22 18:17:41.484: W/System.err(24552): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
05-22 18:17:41.484: W/System.err(24552): at android.os.Handler.dispatchMessage(Handler.java:99)
05-22 18:17:41.484: W/System.err(24552): at android.os.Looper.loop(Looper.java:137)
05-22 18:17:41.484: W/System.err(24552): at android.app.ActivityThread.main(ActivityThread.java:4424)
05-22 18:17:41.488: W/System.err(24552): at java.lang.reflect.Method.invokeNative(Native Method)
05-22 18:17:41.488: W/System.err(24552): at java.lang.reflect.Method.invoke(Method.java:511)
05-22 18:17:41.488: W/System.err(24552): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-22 18:17:41.492: W/System.err(24552): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-22 18:17:41.492: W/System.err(24552): at dalvik.system.NativeStart.main(Native Method)在寻找android.os.NetworkOnMainThreadException时,我找到了文献资料,它声明这是:当应用程序试图在其主线程上执行网络操作时抛出的异常。
由此我得出结论,我应该把我的电话放到一个AsyncTask中。
有谁能确认我是否正确地理解了这一点--或者我在这里漏掉了什么?奇怪的是,我为了弄清这件事而向catch (Throwable e)致敬。
进一步调查(05.22.2012):
我现在可以确认这个问题是因为这个例外.当应用程序试图在其主线程上执行网络操作时,将引发。当我朗读的时候,这开始于蜂巢。
现在这个问题:我得到了雅虎301的回复(永久移动)。这很奇怪,因为当我将URL粘贴到浏览器中时,它可以工作。
知道为什么这应该在浏览器中工作,而不是在应用程序中工作吗?我必须指出,这个HTTP请求接收一个CSV文件作为响应。这会是个问题吗?
进一步调查(05.23.2012):
由于某些原因,当使用雅虎URI http://finance.yahoo.com/d/quotes.csv?s= (在我的代码中)时,响应是301 (永久移动)。而使用http://download.finance.yahoo.com/d/quotes.csv?s=时,响应为200 (OK)。即使这两者在浏览器中都能很好地工作。我很幸运地找到了这个网页,这为我提供了一些线索,说明雅虎对URI的反应。现在我可以看到“读取器”得到了数据,而且几乎一切都很好。我仍然得到了一些奇怪的异常(仍在试图解决它):在阅读了响应中的所有行之后,我捕捉到了一个Throwable (我从以前的实验中留下了它),然后在堆栈中得到了05-23 08:52:41.258: W/dalvikvm(933): threadid=11: thread exiting with uncaught exception (group=0x40a721f8)和关于doInBackground(Void... params)中一个未被发现的异常的东西。还在调查..。
刚刚解决了这个问题--调用Yahoo只是一个错误。必须将&e=.csv添加到URI的末尾,才能使其工作。就像这样:http://download.finance.yahoo.com/d/quotes.csv?s=KDHIX&f=sl1d1t1c1ohgv&e=.csv
最终代码
private ArrayList<String> retrieveStockFinParamsFromYahooApiUri(String yahooApiCall)
{
ArrayList<String> stockFinParamsFromYahooApiUriRows = new ArrayList<String>();
String resultLine = "";
BufferedReader reader = null;
AndroidHttpClient httpClient = AndroidHttpClient.newInstance("yahooGetStockParams");
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet(yahooApiCall);
try
{
HttpResponse response = httpClient.execute(httpGet, localContext);
reader = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
while ((resultLine = reader.readLine()) != null)
{
stockFinParamsFromYahooApiUriRows.add(resultLine);
}
if(response != null)
{
try
{
response.getEntity().consumeContent();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if(httpClient != null)
{
httpClient.close();
}
if (reader != null)
{
try
{
reader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return stockFinParamsFromYahooApiUriRows;
}发布于 2012-05-21 21:21:03
很有可能在执行过程中得到一个不是Exception的IOException。然后,在方法向调用catch的人抛出一个外部异常之前,您的finally块永远不会被执行,并且您的finally块也不会被执行。
你至少有两个选择:
IOException,而是一个prent类。尝试Throwable,打印堆栈跟踪并查看发生了什么。然后,您以后可以添加其他catch块来处理这种情况。(,但您可以暂时使用)。retrieveStockFinParamsFromYahooApiUri调用放在try块中,以确定期望哪些异常类并相应地执行相应的操作。但是,您需要改进对问题的理解,捕捉一切可能的东西,编写堆栈跟踪并检查logcat。
这里有一些其他建议:
HttpConnection,您可以使用响应的实体。来实现这一点。https://stackoverflow.com/questions/10692469
复制相似问题