如何在一个有返回值的方法中进行网络操作,然后返回网络操作后的值?

发布于 2022-09-03 09:09:17 字数 1085 浏览 25 评论 0

如何在一个有返回值的方法中进行网络操作,然后返回网络操作后的值?

比如

private String A(){

 StringRequest stringRequest=new StringRequest(Request.Method.POST, MyApplication.HOST + "/mobileLogin.do",
             new Response.Listener<String>() {
                        @Override
              public void onResponse(String s) {
sout("获取的"+s)
                           }
               }, new Response.ErrorListener() {
                   @Override
                   public void onErrorResponse(VolleyError volleyError) {

                   }
               }){
                   @Override
                   protected Map<String, String> getParams() throws AuthFailureError {
                       Map<String,String> map=new HashMap<>();
                       map.put("msgno","001010");
                       map.put("uid",s);
                       return super.getParams();
                   }
               };
               requestQueue.add(stringRequest);
   } 
   
   

我想返回这个获取的结果,但是volley的操作是在异步,根本没法return,那这个怎么办

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(6

柠北森屋 2022-09-10 09:09:17

可以使用接口回调

  1. 先声明一个接口

public interface RequestCallback{
    void onSuccess(String data);
    void onFail(String error);
}
  1. 然后在方法内使用

private String A(RequestCallback callback){

 StringRequest stringRequest=new StringRequest(Request.Method.POST, MyApplication.HOST + "/mobileLogin.do",
             new Response.Listener<String>() {
                        @Override
              public void onResponse(String s) {
                    sout("获取的"+s)
                    if(callback!=null){
                      callback.onSuccess(s);
                    }
                    
                           }
               }, new Response.ErrorListener() {
                   @Override
                   public void onErrorResponse(VolleyError volleyError) {
                        if(callback!=null){
                            callback.onFail(volleyError.getMessage);
                        }
                        
                   }
               }){
                   @Override
                   protected Map<String, String> getParams() throws AuthFailureError {
                       Map<String,String> map=new HashMap<>();
                       map.put("msgno","001010");
                       map.put("uid",s);
                       return super.getParams();
                   }
               };
               requestQueue.add(stringRequest);
   } 
星軌x 2022-09-10 09:09:17

上RxJava或者EventBus

自此以后,行同陌路 2022-09-10 09:09:17

那就在异步回调函数里做。或者在异步返回的地方传入方法或者传入函数。

林空鹿饮溪 2022-09-10 09:09:17

你可以换种思路,不需要再volley中返回结果。当请求成功后对结果进行封装,例如直接使用List或者结合类进行存储,然后可以通过Handler机制从中获取数据与操作。

寄人书 2022-09-10 09:09:17

我是使用融云的时候需要用户信息提供者,根据他的方法传过来的stringId,我再使用这个id从我的服务器获取这个id对应的信息,,,所以没办法先操作volley,

RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {

        @Override
        public UserInfo getUserInfo(final String s) {

           volley操作,需要使用到s
梓梦 2022-09-10 09:09:17

可以直接用Handler啊
我重新看了一下你的问题,好像涉及到多层回调吧,这里我觉得用RxAndroid比较适合

//假设已经有两个方法,getStringID()用于获取你的用户id
//getUserInfo(String s)根据传入的StringID从你的服务器上获取用户信息
//UserInfo是用户信息类

        Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext(getStringID());//获取id
            }
        })
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        //如果你要处理得到的StringID的话,写在这里,否则不用写
                        return s;
                    }
                })
                .flatMap(new Func1<String, Observable<UserInfo>>() {
                    @Override
                    public Observable<UserInfo> call(String s) {
                        //这个s就是上面return的
                        //返回一个包裹着UserInfo的Observable
                        return Observable.just(getUserInfo(s));
                    }
                })
                .subscribeOn(Schedulers.io())//这段代码上面的都会在子线程中工作
                .observeOn(AndroidSchedulers.mainThread())//这段代码下面的会在主线程中工作
                .subscribe(new Action1<UserInfo>() {
                    @Override
                    public void call(UserInfo userInfo) {
                        //你想对UserInfo进行的操作,比如显示个用户名啥的
                    }
                });

刚接触不久,写出来的代码不大好看。。。求大牛指导

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