2017-01-03 5 views
-3

Im folgenden Code können Sie mir bitte erklären, warum der Block innerhalb der if-Anweisung ausgeführt wird, bevor die Methode request_user_name() aufgerufen wird? Das Ergebnis des folgenden Codes ist die folgende:Warum wird mein Code nicht in der richtigen Reihenfolge ausgeführt?

Ich bin in der if-Anweisung

Ich bin außerhalb der if-Anweisung

request_user_name() aufgerufen wird - OK

geklickt
chatbtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if(request_user_name()) 
      { 
       System.out.println("I am inside the if statement"); 
       Intent intent = new Intent(MainActivity.this, ChatRoom.class); 
       intent.putExtra("room_name", "room"); 
       intent.putExtra("user_name", name); 
       startActivity(intent); 
      } 
      System.out.println("I am outside the if statement"); 
     } 
    }); 




private Boolean request_user_name() { 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Enter Name:"); 
    final EditText input_filed = new EditText(this); 
    builder.setView(input_filed); 
    final Holder<Boolean> accessChatRoom = new Holder<Boolean>(true); 
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      name = input_filed.getText().toString(); 
      System.out.println("request_user_name() called - OK clicked"); 
     } 
    }); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
      System.out.println("request_user_name() called - Cancel clicked"); 
      accessChatRoom.setValue(false); 
     } 
    }); 
    builder.show(); 
    return accessChatRoom.getValue(); 
} 
+5

Was ist der Inhalt von 'request_user_name'? – Moira

+0

Den gesamten Code bitte posten –

+0

request_user_name() Gibt "true" zurück. Veröffentlichen Sie den Code der Methode. –

Antwort

0

Die Code im Block wird nicht vor dem Methodenaufruf request_user_name() ausgeführt; Der Code im Block würde überhaupt nicht ausgeführt, wenn request_user_name() nicht ausgeführt und True zurückgegeben. I. E., der Ausdruck in dem Codeblock wird nur ausgeführt, nachdem die "if" -Bedingung erfüllt wurde (in Ihrem Fall request_user_name()). Versuchen Sie, über die Methode request_user_name() an die Konsole zu drucken, um die Ausführungsreihenfolge zu testen. Meine Vermutung ist, dass Ihr Code innerhalb der request_user_name() Methode nicht Thread-sicher ist. Hilft das?

+0

Sorry, aber ich verstehe noch nicht. request_user_name() gibt abhängig von der Situation wahr oder falsch zurück. Kurz gesagt, diese Methode erstellt einen AlertDialog. Der Benutzer gibt seinen Namen ein und klickt auf Ok oder kann auf Abbrechen klicken. Wenn auf Ok geklickt wird, gibt die Methode "true" zurück, andernfalls wird "false" zurückgegeben. – Zimo

+0

In dem Fall, dass es false zurückgibt, führt der Codeblock aus? – cjbrog

+0

In beiden Fällen (wahr oder falsch) wird request_user_name() nach dem Endumfang der if-Anweisung ausgeführt.Sie können meinen Code testen, wenn Sie wollen, und setzen Sie einige println(), um zu überprüfen, – Zimo

1

Der Code ist in Ordnung und funktioniert wie erwartet: Wenn Sie die Funktion aufrufen, bereitet sie einen Dialog mit seinen ‚Callbacks‘ dann angezeigt:

builder.show(); 

aber der Code weiterhin sofort (zeige ich nicht ein modaler blockierenden Aufruf, geht nur Display) und Code zur nächsten Aussage:

return accessChatRoom.getValue() 

Wert, der zu diesem Zeitpunkt ist, wie durch den Standard festgelegt.

Code hat normales Verhalten: es ist ein Konzeptionsproblem.

HTH

Verwandte Themen