Feststellen ob Thread fertig ist

A

akkulader

Ambitioniertes Mitglied
0
Hallöchen!


Ich habe einen Thread, der Daten aus einer Datenbank ausließt.
Diese braucht dazu ja nicht ewig, sodass der mal geschlossen werden kann.

Das Problem ist eben das Feststellen...

Müsste ja irgendwann nach t.start() kommen.. aber wann und wie?
isAlive() zeigt mir, dass er immer läuft

Ode könnte man iwas mit dem ResultSet machen? Das geht schließlich die Datenbank ab und sollte irgendwie feststellen können, wann sie ausgelesen ist.


Wäre euch für Hilfe sehr dankbar!

Code:
  public static void printNameList()
	  {
		 Thread t = new Thread()
                 { 
			 @Override
			 public void run()
			 {
				 	if(conn != null)
				 	{
                                             ResultSet result =query.executeQuery(sql);
				 		try
                                                {
				 			while(result.next())
                                                        {

                                                        }
		
				 		} 
                                                catch (SQLException e) 
				 		{
				 			e.printStackTrace();
				 		}
				 	}
			 }
		 };
		 t.start();

		 if(t.isAlive())
		  {
			  printThreadLäuft = true;
		  }
 
Zuletzt bearbeitet:
Die "Endbedingung" ist hier wohl nicht ganz unwichtig. Du rufst doch next() auf... Geht das wirklich unendlich lange?^^
 
ui_3k1 schrieb:
Die "Endbedingung" ist hier wohl nicht ganz unwichtig. Du rufst doch next() auf... Geht das wirklich unendlich lange?^^

Ich hab's jetzt nicht stundenlang laufen lassen aber die Threads wurden erst beendet, als ich die App komplett geschlossen hab und auch per langem Klick auf den Homebutton gelöscht hab.

Hier mal der Inhalt des runs
Code:
public void run()
			 {
				 	conn = getInstance();
				 	
	 
				 	if(conn != null)
				 	{
				 		
				 		// Anfrage-Statement erzeugen.
				 		Statement query;
				 		try {
				 			query = conn.createStatement();
	 
				 			// Ergebnistabelle erzeugen und abholen.
				 			String sql = "SELECT name, spiele, guv, tore, diff, pkt FROM mannschaften "
				 					+ "ORDER BY pkt";
				 			ResultSet result = query.executeQuery(sql);
	 
				 			// Ergebnissätze durchfahren. 
				 			while (result.next())
				 			{
				 				String name = result.getString("name"); // Alternativ: result.getString(1);
				 				int spiele = result.getInt("spiele");				 					
				 				int guv = result.getInt("guv");	
				 				int tore = result.getInt("tore");	
				 				int diff = result.getInt("diff");	
				 				int pkt = result.getInt("pkt");	
				 				
				 				
				 				String mannschaft= name + ", " + spiele + ", " + guv+ ", " + tore+ ", " + diff+ ", " + pkt;
				 				
				 				
				 				mannschaftErstellen(name,spiele,guv,tore,diff,pkt);
				 				
				 		
				 			}catch{....


Und hier nochmal der Code meiner generellen Connection

Code:
private static Connection conn = null;


 public void connection ()  
	  {
		  
		  Thread t = new Thread(){
			  
			  
			  @Override
			  public void run(){  
			  try{
				  Class.forName("com.mysql.jdbc.Driver");
				  conn = DriverManager.getConnection("jdbc:mysql://hoster/db?user=user&password=pw");				  
			  }catch(ClassNotFoundException e){
				  System.out.println("Treiber nicht gefunden");
			  }catch(SQLException e){
				  System.out.println("Connect nicht moeglich");
			  }
			  
			  
			  
			  }
			  
		  };
		  t.start();
		  
		
		  
	  }
	 

	  
	 
	  
	  
	  private static Connection getInstance()
	  {
	    if(conn == null)
	      new MySQLConnection();
	    return conn;
	  }


Und bevor es wieder Mecker gibt. Die App wird so nicht in den Playstore geladen.
Entweder ich lasse die JDBC Verbindung so und verteile sie nur an Freunde, oder ich stelle am Ende auf ne MySQL-PHP Verbindung um
 
Probiere mal in deiner while
Code:
if(result.next().next() == null){
Log.d(TAG,"vorletzter Eintrag...");
}
in C ging das mit verketteten Listen immer super...

Wobei eine sauberere Lösung wohl wäre, dass du über den Cursor mitzählen lässt und den Progress via einem AsyncTask anzeigst (und die Logik ebenfalls im AsyncTask laufen lässt - aber da bin ich selbst auch kein Fachmann^^ - deswegen hast du von mir keine Kritik zu befürchten^^)
 
Hab ich mit next().Next() nicht das Problem, dass der Cursor sich um 2 weiter bewegt hat und mir die Einträge dann fehlen? Aber ich probiers nachher mal aus.

Btw was kann ich dann mit dem Tag eig anfangen? ^^
 
Der TAG in dem Code von ui_3k1 ist eine String Konstante, damit man den Eintrag im Logcat wiederfindet.

Edit: Trotzdem ist dein Design nicht mehr zeitgemäß.
Du versuchst über JDBC eine Datenbank in einem Netzwerk abzufragen. Heutzutage macht man eher einen WebService, der mittels JSON mit einer App kommuniziert.
 
Zuletzt bearbeitet:
Ja das weiss ich. Wie gesagt werd ich das am Ende wohl noch umbauen. Bin aber Grad froh, dass es überhaupt funktioniert ^^

Ich probier das nachher Zuhause mal aus
 
Zuletzt bearbeitet von einem Moderator:
Mal zwei generelle Fragen:

  1. Wieso willst du überhaupt von ausserhalb des Threads herausfinden, ob der Thread fertig ist?
  2. Wie sieht deine Prüfung überhaupt aus?

Wenn deine Begründung nämlich lautet, dass du auf den Thread warten musst, bevor du im Haupt-Thread weitermachen kannst, dann ist vielleicht eher dein Aufbau nicht ideal. Wenn der Haupt-Thread nämlich so sehr vom Resultat des anderen Threads abhängt, dass er in der zwischenzeit blockiert wird, dann kannst du auch gleich komplett auf den Thread verzichten. Mit "blockiert" meine ich auch wirklich blockiert, z.B. mit einer while-Schleife, die solange isAlive() prüft, bis der andere Thread endlich fertig ist.

Bei sauberem Design kann es natürlich auch gut mal vorkommen, dass der Main-Thread nichts von deinem Code abarbeitet, mit dem Unterschied, dass er nicht blockiert ist. Er kann dann weiterhin das User Interface zeichnen und auf Usereingaben reagieren, was auch der Hauptgrund ist, warum Android dich zwingt, bei Netzwerkoperationen einen eigenen Thread zu verwenden.

Ich will nicht behaupten, dass du es falsch machst. Deine Fragestellung klingt nur ein bisschen so, als müsstest unbedingt im Haupt-Thread wissen, wann der andere Thread fertig ist. Android bietet z.B. die Klasse AsyncTask, die kann oft für solche Dinge eingesetzt werden. Die Methode doInBackground() läuft dabei in einem eigenen Thread und die Methode onPostExecute() läuft wieder im Original-Thread. Damit kannst du asynchrone Dinge nebenläufig erledigen, am Schluss ein Resultat an onPostExecute() übergeben und von dort wieder im UI-Thread arbeiten (TextViews ändern, eine andere Methode der Activity aufrufen etc.)
 
Ne der hauptthread funktioniert wunderbar. Und ich kann auch die Ergebnisse des nebenthreads auslesen.
Jedoch würde ich ihn gerne schließen, sobald der Code ein mal durch gelaufen ist.
Einfach nur, um nicht endlos eine threads zu erzeugen, die erst gelöscht werden, wenn man die App schließt und sie zusätzlich manuell beendet.

Außerdem muss das auslesen der Datenbank nur ein mal erfolgen und nicht immer wieder.
 
Sobald die run()-Methode eines Threads durchlaufen ist, ist der Thread fertig und du musst nichts weiter tun. Deshalb frag ich auch, wie du überhaupt überprüfst, ob der Thread noch läuft. Das Codebeispiel aus deinem Eröffnungspost gibt dir ja nur den Status des Threads gleich nachdem er gestartet wurde.
 
  • Danke
Reaktionen: akkulader
Ah ok! Dann bleibt er also in der while hängen.
Wie kanns denn sein, dass resultset.Next() immer neue Einträge findet und nicht iwann bei Null landet oder so.

Werd nachher mal auf Null prüfen
 
Ihr habt Recht.. irgendwie kommt die while zum Ende, jedoch verschwindet danach keiner der Threads, die mir im Debug Modus von Eclipse angezeigt werden.

Ist das nur n Fehler oder stimmt das iwie?
 
Jo, der Thread kommt nicht zum Ende weil er nicht explizit gestoppt wird. Mit stop() kannst du ihn beenden. So sollte er dann auch verschwinden. (wie gesagt, bin in Sachen "Threads" selbst nicht so der Überflieger und bekomme da auch hin und wieder mal Probleme^^)
 

Ähnliche Themen

U
  • unerfahrenerAppEntwickler
Antworten
3
Aufrufe
709
swa00
swa00
W
  • waltsoft
Antworten
3
Aufrufe
723
waltsoft
W
Zurück
Oben Unten