cari

Rumah  >  Soal Jawab  >  teks badan

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中文网2810 hari yang lalu462

membalas semua(6)saya akan balas

  • 黄舟

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

    Anda boleh menggunakan panggil balik antara muka

    1. Isytiharkan antara muka dahulu

    public interface RequestCallback{
        void onSuccess(String data);
        void onFail(String error);
    }
    
    1. kemudian gunakan

    di dalam kaedah
    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);
       } 

    balas
    0
  • PHPz

    PHPz2017-04-18 09:42:00

    Gunakan RxJava atau EventBus

    balas
    0
  • 怪我咯

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

    Kemudian lakukannya dalam fungsi panggil balik tak segerak. Atau masukkan kaedah atau fungsi di mana pulangan tak segerak berlaku.

    balas
    0
  • 巴扎黑

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

    Anda boleh mengubah fikiran anda dan tidak perlu mengembalikan keputusan dalam volley. Apabila permintaan itu berjaya, hasilnya dirangkumkan, contohnya, menggunakan List secara langsung atau digabungkan dengan kelas untuk menyimpannya, dan kemudian data dan operasi boleh diperoleh daripadanya melalui mekanisme Handler.

    balas
    0
  • ringa_lee

    ringa_lee2017-04-18 09:42:00

    Apabila saya menggunakan Rongyun, saya memerlukan pembekal maklumat pengguna Mengikut stringId yang diluluskan oleh kaedahnya, saya kemudian menggunakan id ini untuk mendapatkan maklumat yang sepadan dengan id ini dari pelayan saya,,, jadi tidak ada cara untuk beroperasi. tampar dulu

    RongIM.setUserInfoProvider(RongIM.UserInfoProvider() baharu {

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

    balas
    0
  • PHP中文网

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

    Anda boleh menggunakan Handler secara langsung
    Saya membaca semula soalan anda dan nampaknya ia melibatkan panggilan balik berbilang lapisan, saya rasa RxAndroid lebih sesuai di sini

    //假设已经有两个方法,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进行的操作,比如显示个用户名啥的
                        }
                    });

    Saya baru sahaja bermula dan kod yang saya tulis tidak begitu cantik. . . Mendapat bimbingan daripada pakar

    balas
    0
  • Batalbalas