android - Bagaimana untuk membuat fungsi mengembalikan nilai pulangan permintaan tak segerak?
扔个三星炸死你
扔个三星炸死你 2017-06-26 10:49:53
0
2
1255

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

membalas semua(2)
黄舟

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

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
                }

});
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan