recherche

Maison  >  Questions et réponses  >  le corps du texte

android - Comment faire en sorte qu'une fonction renvoie la valeur de retour d'une requête asynchrone?

Le réseau demande un numéro de téléphone mobile, et le résultat renvoie nul, car la fonction exécute return sans attendre le retour de la requête réseau. Comment modifier le code suivant ?

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];
}
扔个三星炸死你扔个三星炸死你2702 Il y a quelques jours1249

répondre à tous(2)je répondrai

  • 黄舟

    黄舟2017-06-26 10:51:53

    Bien sûr, vous devez utiliser CountDownLatch pour convertir les requêtes asynchrones en requêtes synchrones bloquantes

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

    répondre
    0
  • 世界只因有你

    世界只因有你2017-06-26 10:51:53

    Je pense qu'il y a quelque chose qui ne va pas avec votre fonction. Le paramètre formel id n'y est pas utilisé, ce qui est très étrange. Si vous souhaitez obtenir des données asynchrones, la plus couramment utilisée est le rappel asynchrone. Vous pouvez essayer RXJava à l'avenir et vous serez surpris.

    Réécrivez cette fonction comme suit :

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

    Lorsque vous appelez, ça peut être

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

    répondre
    0
  • Annulerrépondre