Volley获取Json数据异常
2016-07-15 01:04
495 查看
这两天用Volley加载网上数据碰到两个奇怪的问题,百思不得其解,现在还没弄明白为什么会出现这种问题,先记录在此:
调用Volley方法StringRequest获取网页数据,调试的时候在某次添加断点运行异常,去掉断点则运行正常
调用Volley方法JsonObjectRequest获取http://www.weather.com.cn/data/sk/101010100.html数据异常,但获取http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号和http://api.map.baidu.com/telematics/v3/trafficEvent?location=%E5%8C%97%E4%BA%AC&output=json&ak=E4805d16520de693a3fe707cdc962045数据均正常
在调试上面代码的时候,我们会进入到Volley的jar包中BasicNetwork.java单元中的performRequest方法,该方法会调用这么依据代码setConnectionParametersForRequest(connection, request);
我们进入到setConnectionParametersForRequest方法后把断点设置在
下面这句代码上connection.setRequestMethod(“GET”);
运行则报错,去掉断点正常,好晕
这是当时调试时候截的图片,如下:
上图代码设置断点后,执行报错,报错如下图
网上查了一下,也有人有同样问题
http://stackoverflow.com/questions/19766327/android-java-net-protocolexception-connection-already-established
真是见了鬼了啊,有谁知道原因的麻烦告知下啊
很简单的一段代码,就是用于获取网上的一段天气预报数据(Json格式),我们用浏览器打开查看发现数据完全正常
,但运行的时候报错,经过调试我们发现异常是BasicNetwork.java单元中的方法entityToBytes的代码引起的,如下图
从图上我们知道引起异常的代码就是这句while ((count = in.read(buffer)) != -1)代码导致的(volley原程序中没有try catch,这个是我自己加的),因此导致该方法entityToBytes没有返回值,从而导致取不到数据。
解决办法就是:像我一样将上面代码用try catch包裹起来即可,但现在不知道为什么访问其他网页的json数据又不会报异常呢,比如这两个接口都正常http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号和http://api.map.baidu.com/telematics/v3/trafficEvent?location=%E5%8C%97%E4%BA%AC&output=json&ak=E4805d16520de693a3fe707cdc962045。真是坑爹有没有,还有为什么读取数据会报java.io.EOFException异常
调用Volley方法StringRequest获取网页数据,调试的时候在某次添加断点运行异常,去掉断点则运行正常
调用Volley方法JsonObjectRequest获取http://www.weather.com.cn/data/sk/101010100.html数据异常,但获取http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号和http://api.map.baidu.com/telematics/v3/trafficEvent?location=%E5%8C%97%E4%BA%AC&output=json&ak=E4805d16520de693a3fe707cdc962045数据均正常
1.接下来我们就来先说说第一种情况,先上测试时候用的代码
public void TestStringRquestByGet() { StringRequest request = new StringRequest("https://www.baidu.com/", new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("TAG", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.getMessage(), error); } }); RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this); mQueue.add(request); }
在调试上面代码的时候,我们会进入到Volley的jar包中BasicNetwork.java单元中的performRequest方法,该方法会调用这么依据代码setConnectionParametersForRequest(connection, request);
我们进入到setConnectionParametersForRequest方法后把断点设置在
下面这句代码上connection.setRequestMethod(“GET”);
运行则报错,去掉断点正常,好晕
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) throws IOException, AuthFailureError { ... setConnectionParametersForRequest(connection, request); ... }
static void setConnectionParametersForRequest(HttpURLConnection connection, Request<?> request) throws IOException, AuthFailureError { switch (request.getMethod()) { ... case Method.GET: connection.setRequestMethod("GET"); break; ... } }
这是当时调试时候截的图片,如下:
上图代码设置断点后,执行报错,报错如下图
网上查了一下,也有人有同样问题
http://stackoverflow.com/questions/19766327/android-java-net-protocolexception-connection-already-established
真是见了鬼了啊,有谁知道原因的麻烦告知下啊
2.第二个问题,同样先上代码
public void TestJsonObjectRequest() { JsonObjectRequest request = new JsonObjectRequest( Request.Method.GET, "http://www.weather.com.cn/data/sk/101010100.html", null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d("TAG", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.getMessage(), error); } }); RequestQueue mQueue = Volley.newRequestQueue(this); mQueue.add(request); }
很简单的一段代码,就是用于获取网上的一段天气预报数据(Json格式),我们用浏览器打开查看发现数据完全正常
,但运行的时候报错,经过调试我们发现异常是BasicNetwork.java单元中的方法entityToBytes的代码引起的,如下图
从图上我们知道引起异常的代码就是这句while ((count = in.read(buffer)) != -1)代码导致的(volley原程序中没有try catch,这个是我自己加的),因此导致该方法entityToBytes没有返回值,从而导致取不到数据。
解决办法就是:像我一样将上面代码用try catch包裹起来即可,但现在不知道为什么访问其他网页的json数据又不会报异常呢,比如这两个接口都正常http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号和http://api.map.baidu.com/telematics/v3/trafficEvent?location=%E5%8C%97%E4%BA%AC&output=json&ak=E4805d16520de693a3fe707cdc962045。真是坑爹有没有,还有为什么读取数据会报java.io.EOFException异常
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories