如何让一个函数return异步请求的返回值?

发布于 2022-09-05 04:22:01 字数 721 浏览 20 评论 0

网络请求一个手机号,结果返回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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

比忠 2022-09-12 04:22:01

当然要用CountDownLatch 啦,异步请求转阻塞式同步请求

public String getPhone(String id) {
    String url = "http://www.163.net/";
    final CountDownLatch latch = new CountDownLatch(1); 
    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) {
                     latch.countDown();  
                }

                @Override
                public void onResponse(String response, int id) {
                    phone[0] = response;
                    latch.countDown();  
                }
            });
            try {  
           latch.await();  
       } catch (InterruptedException e) {  
       }  
    return phone[0];
}
请你别敷衍 2022-09-12 04:22:01

我觉得你这个函数有问题啊,那个形参id在里面没用到啊,很奇怪。假如想要获取异步的数据,最常用的的就是异步回调,你以后可以试下RXJava,会发现惊喜。

把这个函数改写下,如下:

public static void getPhone(String id,StringCallback cb) {
    String url = "http://www.163.net/";

    final String[] phone = new String[1];
    OkHttpUtils
            .get()
            .url(url)
            .addParams("username", "abc")
            .addParams("password", "123")
            .build()
            .execute(cb);
}

在调用的时候,可以是

 XXutil.getPhone("1234566",new StringCallback(){

                @Override
                public void onError(Call call, Exception e, int id) {
                    //do something
                }

                @Override
                public void onResponse(String response, int id) {
                    //do something
                }

});
暮年慕年 2022-09-12 04:22:01

//我记得这样是同步返回。

Response response= OkHttpUtils
            .get()
            .url(url)
            .addParams("username", "abc")
            .addParams("password", "123")
            .build()
            .execute();

我觉得网络请求尽量异步吧。

雪落纷纷 2022-09-12 04:22:01

我推荐的方式是在getPhone()参数列表里面添加一个final 修饰的结果回调参数callback, 在onResponse()中调用callback.succeess(phoneNum),即从主动获取结果型变成结果主动推送型 , 而不是通过getPhone()的返回值去获取phoneNum, 当然使用阻塞式同步请求也是可行, 不过latch没控制好很容易出现问题噢。

筑梦 2022-09-12 04:22:01

首先, 正确的返回值只能在回调里获取, 考虑到返回值的作用域,只需要控制其访问权限

囍孤女 2022-09-12 04:22:01

这个操作是不能放在主线程的,Android会直接抛异常

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文