搜尋

首頁  >  問答  >  主體

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

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

比如

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,那这个怎么办
PHP中文网PHP中文网2828 天前472

全部回覆(6)我來回復

  • 黄舟

    黄舟2017-04-18 09:42:00

    可以使用介面回呼

    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);
       } 

    回覆
    0
  • PHPz

    PHPz2017-04-18 09:42:00

    上RxJava或EventBus

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 09:42:00

    那就在非同步回呼函數裡做。或在非同步返回的地方傳入方法或傳入函數。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:42:00

    你可以換種思路,不需要再volley中返回结果。当请求成功后对结果进行封装,例如直接使用List或者结合类进行存储,然后可以通过Handler機制從中取得資料與操作。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 09:42:00

    我是使用融雲的時候需要用戶資訊提供者,根據他的方法傳過來的stringId,我再使用這個id從我的伺服器獲取這個id對應的資訊,,,所以沒辦法先操作volley,

    RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {

            @Override
            public UserInfo getUserInfo(final String s) {
    
               volley操作,需要使用到s

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:42:00

    可以直接用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进行的操作,比如显示个用户名啥的
                        }
                    });

    剛接觸不久,寫出來的程式碼不大好看。 。 。求大牛指導

    回覆
    0
  • 取消回覆