如何让一个函数return异步请求的返回值?
网络请求一个手机号,结果返回null,因为函数没有等到网络请求回来就执行了return,请问下面的代码如何修改?
public String getPhone(String id) {
String url = "http://www.163.net/";
final String[] phone = new String[1];
OkHttpUtils
.get()
.url(url)
.addParams("username", "abc")
.addParams("password", "123")
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(String response, int id) {
phone[0] = response;
}
});
return phone[0];
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
当然要用CountDownLatch 啦,异步请求转阻塞式同步请求
我觉得你这个函数有问题啊,那个形参id在里面没用到啊,很奇怪。假如想要获取异步的数据,最常用的的就是异步回调,你以后可以试下RXJava,会发现惊喜。
把这个函数改写下,如下:
在调用的时候,可以是
//我记得这样是同步返回。
我觉得网络请求尽量异步吧。
我推荐的方式是在getPhone()参数列表里面添加一个final 修饰的结果回调参数callback, 在onResponse()中调用callback.succeess(phoneNum),即从主动获取结果型变成结果主动推送型 , 而不是通过getPhone()的返回值去获取phoneNum, 当然使用阻塞式同步请求也是可行, 不过latch没控制好很容易出现问题噢。
首先, 正确的返回值只能在回调里获取, 考虑到返回值的作用域,只需要控制其访问权限
这个操作是不能放在主线程的,Android会直接抛异常