对于Volley中onResponse无法返回数据结果的问题解决方法
2017-11-29 15:34
561 查看
本来volley用的好好的,也可以在onResponse里面直接更新UI,可是当我自己写了一个工具类之后发现没法获取到onResponse的数据了,急的我焦头烂额,各种找错误,最后发现异步方法还没有执行完,所以没法直接给变量赋值,这时我们就需要callback或者Handler什么的进行出具处理了。
话不多说快上马:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
这个时候return的值是null,因为异步的网络操作还没有结束所以并没有给results赋值
通过添加回调机制之后可以保证我们是在异步任务结束后在使用这个数据,所以不用考虑任务的前后顺序。
接下来就是具体的解决方法了:
在Volley中添加callback回调方法,然后在主线程中调用方法处理数据
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
在主线程中调用方法
2
3
4
5
6
这个方法的缺点也比较明显,因为volley方法和UI更新是异步操作的,所以有可能UI更新的时候数据还没有传过来,这时候就会出现空指针错误了,所以我们如果想要使用这个方法的时候最好保证UI更新是在异步方法结束之后。
在主线程中创建Handler
2
3
4
5
6
7
onResponse方法中进行数据传递(此方法需要将主线程中的Handler对象作为参数传到volley中)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
话不多说快上马:
原来的volley类:
public class VolleyUtil { private String results; public String get(Context context, String url) { RequestQueue requestQueue = Volley.newRequestQueue(context); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { results = jsonObject.toString(); Log.e("recycler", "onResponse: "+results ); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.e("recyclerveiw", "onErrorResponse:" + volleyError); } }); requestQueue.add(jsonObjectRequest); return results; } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
这个时候return的值是null,因为异步的网络操作还没有结束所以并没有给results赋值
解决方法一******添加回调方法:
通过添加回调机制之后可以保证我们是在异步任务结束后在使用这个数据,所以不用考虑任务的前后顺序。 接下来就是具体的解决方法了:
在Volley中添加callback回调方法,然后在主线程中调用方法处理数据
public class VolleyUtil { private String results; public void get(Context context, String url, final VolleyCallback callback) { RequestQueue requestQueue = Volley.newRequestQueue(context); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { results = jsonObject.toString(); callback.onSuccess(results); Log.e("recycler", "onResponse: " + results); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.e("recyclerveiw", "onErrorResponse:" + volleyError); } }); requestQueue.add(jsonObjectRequest); } public interface VolleyCallback { void onSuccess(String result); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
在主线程中调用方法
VolleyUtil volleyUtil=new VolleyUtil(); volleyUtil.get(this, url, new VolleyUtil.VolleyCallback() { @Override public void onSuccess(String result) { //do something });1
2
3
4
5
6
解决方法二******利用Handler传递数据:
这个方法的缺点也比较明显,因为volley方法和UI更新是异步操作的,所以有可能UI更新的时候数据还没有传过来,这时候就会出现空指针错误了,所以我们如果想要使用这个方法的时候最好保证UI更新是在异步方法结束之后。 在主线程中创建Handler
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { datas = (String) msg.obj; Log.e("123465", "handleMessage: " + datas); } };1
2
3
4
5
6
7
onResponse方法中进行数据传递(此方法需要将主线程中的Handler对象作为参数传到volley中)
public VolleyUtil(Context context, String url,final Handler handler){ RequestQueue requestQueue = Volley.newRequestQueue(context); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { results = jsonObject.toString(); Message message=new Message(); message.obj=results; handler.sendMessage(message); Log.e("recycler", "onResponse: " + results); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.e("recyclerveiw", "onErrorResponse:" + volleyError); } }); requestQueue.add(jsonObjectRequest); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
相关文章推荐
- 对于Volley中onResponse无法返回数据结果的问题解决方法
- 使用dwr同步调用导致无法获取js方法的返回结果问题的解决办法
- .NET easyui form提交后,返回json数据在IE下弹出下载的问题解决方法
- MyEclipse生成的Spring+Hibernate无法保存数据问题的解决方法
- session_start()导致history.go(-1)返回时无法保存表单数据的解决方法
- .NET easyui form提交后,返回json数据在IE下弹出下载的问题解决方法
- 对常规启用 IIS6.0 Gzip 方法的补充,用于解决wget、curl等无法得到压缩结果的问题
- 关于datagridview单元格不切换焦点无法获得新输入数据的问题解决方法
- 解决高德地图在线API不支持对应的方法回调返回结果的问题
- IE9下Ajax无法刷新数据的缓存问题解决方法
- session_start()导致history.go(-1)返回时无法保存表单数据的解决方法
- 解决ext+struts文件上传,json返回结果无法读取到的问题
- jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
- session_start()导致history.go(-1)返回时无法保存表单数据的解决方法
- IE9下Ajax无法刷新数据的缓存问题解决方法
- Spring MVC 对于返回JSON格式数据的中文乱码 解决方法
- 解决ASP.NET MVC的FileStreamResult无法正确返回数据问题
- 无法从COM口读取数据问题的解决方法
- json返回hibernate的结果会自动调用(get)查询出关联表的数据,解决方法
- phpcms调用getJSON无法返回json数据的解决方法