java - 如何在一个有返回值的方法中进行网络操作,然后返回网络操作后的值?
PHP中文网
PHP中文网 2017-04-18 09:40:00
0
6
452

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

比如

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中文网

认证高级PHP讲师

répondre à tous(6)
黄舟

Vous pouvez utiliser le rappel d'interface

  1. Déclarez d'abord une interface

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

à l'intérieur de la méthode
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);
   } 
PHPzhong

Utilisez RxJava ou EventBus

刘奇

Ensuite, faites-le dans la fonction de rappel asynchrone. Ou transmettez une méthode ou une fonction où le retour asynchrone se produit.

巴扎黑

Vous pouvez changer d'avis et vous n'avez pas besoin de renvoyer le résultat dans volley. Lorsque la requête réussit, le résultat est encapsulé, par exemple en utilisant List directement ou en combinaison avec une classe pour le stocker, puis les données et les opérations peuvent en être obtenues via le mécanisme Handler.

左手右手慢动作

Lorsque j'utilise Rongyun, j'ai besoin d'un fournisseur d'informations utilisateur. D'après le stringId passé par sa méthode, j'utilise ensuite cet identifiant pour récupérer les informations correspondant à cet identifiant depuis mon serveur,,, donc il n'y a aucun moyen de fonctionner. volée en premier

RongIM.setUserInfoProvider(nouveau RongIM.UserInfoProvider() {

        @Override
        public UserInfo getUserInfo(final String s) {

           volley操作,需要使用到s
洪涛

Vous pouvez utiliser Handler directement
J'ai relu votre question et elle semble impliquer des rappels multicouches. Je pense que RxAndroid est plus approprié ici

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

Je viens de commencer et le code que j'ai écrit n'est pas très joli. . . Demander conseil à des experts

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal