Rumah > Soal Jawab > teks badan
Rangkaian meminta nombor telefon mudah alih, dan hasilnya kembali batal, kerana fungsi tersebut melaksanakan pemulangan tanpa menunggu permintaan rangkaian datang semula. Bagaimana untuk mengubah suai kod berikut?
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
Sudah tentu anda perlu menggunakan CountDownLatch untuk menukar permintaan tak segerak kepada menyekat permintaan segerak
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
Saya rasa ada sesuatu yang salah dengan fungsi anda Id parameter formal tidak digunakan di dalamnya, yang sangat pelik. Jika anda ingin mendapatkan data tak segerak, yang paling biasa digunakan ialah panggilan balik tak segerak Anda boleh mencuba RXJava pada masa hadapan dan anda akan terkejut.
Tulis semula fungsi ini seperti berikut:
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);
}
Bila call pun boleh
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
}
});