Timeout-Abfrage, Gui baut sich erst danach auf

Hallo Leute,

ich habe einen Java-Server und einen Java-Client. Der Client ist eine Android-App auf meinem Handy. Es funktioniert auch alles soweit, nun wollte ich die App “schön” machen und eine Timeoutabfrage einbauen.

Heißt: Wenn man auf verbinden drückt, kommt dieser Kreis, der sich dreht und darunter steht: “Verbindung wird gesucht…”

Folgenden Code habe ich mir überlegt:

int i = 0;
		do {			
	
			try {
				 Socket s = new Socket("hier die Server ip", 5000);
				 System.out.println("Verbindung");
				 i = 6;
				
				 
				 
			} catch(Exception e) {
				 System.out.println("Verbindung Server Exception" + e);
				 i = i + 1;
			}
			System.out.println(i);
			
		} while(i < 4);
		
		if(i == 6) {
			System.out.println("Weitere Operationen");	
		} else {
			System.out.println("Keine Verbindung gefunden");
		}
		
		

Findet er die Verbindung, verlässt er die Schleife und kann Daten o.ä. an den Server schicken.

Findet er keinen Server, wird ein Timeout mitgezählt (hier 4). Kommt es zum Timeout, wird die Schleife verlassen und es kommt zu einem Fehler.

Nun tritt ein total blödes (unschönes) Problem auf.

In meiner Main klicke ich auf einen Button “verbinden”, ein Intent leitet mich weiter auf ein neues Layout. Nun wird mein Verbindungscode ausgeführt, bevor die GUI sich aufbauen kann. D.h. man starrt solange auf einen schwarzen Bildschirm bis die Schleife zu Ende durchgelaufen ist. Das ist natürlich mist.

Ich habe es auch schon probiert, den Verbindungscode in einem Thread auszulagern, aber da tritt daselbe Problem auf.

Hat jmd. Ideen?

Andere Frage nebenbei: Ich habe nach so eine Timeout-Abfrage gegoogelt. Konnte aber nichts Gescheites finden. Ist mein Vorgehen geschickt oder gibt es deutlich einfacherer Lösungen?

Gruß

Kuzdu

Wenn du das ganze in einen neuen Thread setzt, sollte das passen, poste mal diesen Code!
Hast du denn die Methode Socket.connect(InetAdress, timeout) schon gesehen?

LG

Hey, danke für deine Antwort.

Ich habe es gerade hinbekommen. Hier mein funktionierender Code. Es hat doch mit Threads funktioniert. :slight_smile:

verbinden = (Button) findViewById(R.id.verbindenBtn);
		
	
		verbinden.setOnClickListener(new View.OnClickListener() {
				
				@Override
				public void onClick(View v) {
				
			    dialog = ProgressDialog.show(MainActivity.this, "Suche Verbindung", "Bitte warten");
					
			    startProgress();	
		
			}

			
			}); 
	}
	
	public void startProgress() {
		
		 Runnable runnable = new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				
				try {
					 Socket s = new Socket("IP", 5000);
					 dialog.dismiss();
					 System.out.println("Client ist beigetreten");
				} catch (UnknownHostException e1) {
					System.out.println("Erste Exception, keine Verbindung gefunden." + e1);
					 dialog.dismiss();
				} catch (IOException e1) {
					System.out.println("Zweite Exception, keine Verbindung gefunden." + e1);
					 dialog.dismiss();
				}
	 
			}
			 
		 };
    	 new Thread(runnable).start();
	}

Auf „Socket.connect(InetAdress, timeout)“ bin ich beim Googlen gestoßen, verwende sie aber nicht. Werde sie vielleicht verwenden, je nachdem, ob die noch benötigt wird.

Quelle meines Codes ist:Vogella - hier

Du programmierst hier Android und nicht Java SE. Deshalb hier ein paar Vorschläge von mir:
[ul]
[li]Verwende die Android-Klassen für Nebenläufigkeit (AsyncTask, IntentService, Service z.B.). Die bringen dir im Normalfall auch die Werkzeuge mit um ohne viel Code vom zweiten Thread Aktionen im UI-Thread auszulösen.
[/li][li]System.out.println hat in einer App nichts verloren. Verwende den Logger mit der richtigen Log-Stufe.
[/li][/ul]