Ich habe eine Methode erstellt, um zu überprüfen, ob meine App über OkHttp eine Verbindung zu meinem Server herstellen kann.

Dies ist meine Testklasse:

public class NetworkTest {

static boolean resultWeb = false;

public static boolean pingTestWeb() {

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
            .url("http://www.google.com")//My server address will go here
            .build();

    client.newCall(request).enqueue(new Callback() {

        @Override
        public void onFailure(Request request, IOException e) {
            resultWeb = false;
            Log.i("Error","Failed to connect: "+e.getMessage());
        }

        @Override
        public void onResponse(Response response) throws IOException {

            Log.i("Success","Success: "+response.code());
            if (response.code() == 200) {
                resulWeb = true;
            }
        }
    });

    return resultWeb;
}

Und hier mache ich den Test für meine Aktivität auf OnCreate ():

if (NetworkTest.pingTestWeb()) {

        // Do something if true...

    } else {

        // Do something if false, like showing an AlertDialog...
    }

Die Frage ist, mein pingTestWeb hat die Standard-Timeout-Zeit von 10000 ms. Wie kann ich die Aktivität dazu bringen, den AlertDialog nur dann zu erstellen, wenn das pingTestWeb falsch ist? Weil es nicht auf die Antwort wartet.

5
Rafael 4 Jän. 2016 im 21:12

2 Antworten

Beste Antwort

Ich denke, was hier passieren kann, ist, dass Sie den OkHttp-Aufruf asynchron ausführen, also die return-Anweisung treffen, bevor die Aufgabe abgeschlossen ist. Wäre es für den Test möglich, den OkHttp-Aufruf synchron durchzuführen? Sie können den Erfolgs- / Fehlerfall mit response.isSuccessful behandeln (siehe unten).

   private final OkHttpClient client = new OkHttpClient();

   public void run() throws Exception {
       Request request = new Request.Builder()
           .url("your_url_here")
           .build();

       Response response = client.newCall(request).execute();
       if(response.isSuccessful()){
           return true;             
        }else return false;

    }
4
Joopkins 4 Jän. 2016 im 19:01

Sie können auch CountDownLatch verwenden. Auf diese Weise können Sie Async in Ihren Test einfügen:

public class NetworkTest {

static boolean resultWeb = false;

public static boolean pingTestWeb() {

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
            .url("http://www.google.com")//My server address will go here
            .build();

    CountDownLatch countDownLatch = new CountDownLatch(1);
    client.newCall(request).enqueue(new Callback() {

        @Override
        public void onFailure(Request request, IOException e) {
            resultWeb = false;
            Log.i("Error","Failed to connect: "+e.getMessage());
            countDownLatch.countDown();
        }

        @Override
        public void onResponse(Response response) throws IOException {

            Log.i("Success","Success: "+response.code());
            if (response.code() == 200) {
                resulWeb = true;
            }
            countDownLatch.countDown();
        }
    });

    countDownLatch.await();
    return resultWeb;
}
8
foxwendy 25 Juli 2018 im 19:28