Maison > Questions et réponses > le corps du texte
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];
}
黄舟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];
}
世界只因有你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
}
});