android - Comment faire en sorte qu'une fonction renvoie la valeur de retour d'une requête asynchrone?
扔个三星炸死你
扔个三星炸死你 2017-06-26 10:49:53
0
2
1259

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];
}
扔个三星炸死你
扔个三星炸死你

répondre à tous(2)
黄舟

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];
}
世界只因有你

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
                }

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