Timer im Service der ein Thread erstellt

Webster

Webster

Erfahrenes Mitglied
25
Hallo beisammen,

ich versuche momentan in einem Service (android.app.Service) in einem bestimmten Abstand einen Timer zu starten :

Code:
    	Timer timer = new Timer();
    	int delay = 0;
    	int period = 60000;
    	
    	timer.scheduleAtFixedRate(
    			new TimerTask(){

					@Override
					public void run() {
	                                      GetDataFromServerThread(new getHandler());
					}
    				
    			}
    			, delay, period);

Dies funktioniert auch, aber ich möchte in diesem TimerTask ein Thread erstellen, der Daten aus dem Web holt und einen Callback-Handler auslöst, wenn die Daten vorhanden sind. Egal wie ich es versuche, entweder hängt sich meine GUI auf oder der Callback-Handler wird nicht ausgelöst. Das heißt es stimmt etwas mit dem Thread nicht.

Code:
    private void GetDataFromServerThread(final Handler threadCallbackHandler){
    	
    	Thread conThread = new Thread(){
    		@Override
    		public void run(){
    			
    			String ConRes = getDataFromServer();
    			Message msg = new Message();
    			Bundle bundle = new Bundle();
    			bundle.putString("ConResult", ConRes);
    			msg.setData(bundle);
    			threadCallbackHandler.sendMessage(msg);
    		}
    	};
    	
    	conThread.start();
    }
	
	private Handler getHandler() {
		final Handler threadCallbackHandler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				Bundle bundle = msg.getData();
				mConResult = bundle.getString("ConResult") ;	
				super.handleMessage(msg);
			}
		};
		return threadCallbackHandler;
	}

Kann es sein, dass in einer run() keine weitere run() aufgerufen werden darf?
Oder sieht jemand meinen Denkfehler?!?

Gruß
Webster
 
Ich würde dir ja gerne helfen, jedoch ist dein Quellcode unstrukturiert, verschachtelt und hält sich nicht an gängige Java-Konventionen, sodass ich beim besten Willen nicht verstehe, was du eigentlich machen willst...

Gruß
Chris
 
Tja, so sieht es halt aus, wenn man niemals Java gelernt hat, sondern sich alles selbst beigebraucht hat. Was ist denn so schlimm an meinem Code?

Was ich machen will:
In einem Service möchte ich in bestimmten Abständen von einem Server Daten abfragen und diese Daten wenn Sie vorhanden sind anzeigen lassen.

Der Service, die Abfragen der Daten in einem eigenen Thread und das Anzeigen der Daten mit einem (Callback)Handler funktioniert. Lediglich das Abfragen in bestimmten Abständen funktioniert nicht, d.h. mit dem TimerTask immer wieder einen Thread erstellen. Ich weiß nicht warum, aber der Handler wird mit getHandler nicht über den TimerTask erstellt. Ohne funktioniert es :confused:
 
Webster schrieb:
Was ist denn so schlimm an meinem Code?

Inline-Klassen nur wenn absolut nötig, Klassennamen beginnen immer mit einem Großbuchstaben, Methoden und Variablennamen immer mit einem Kleinbuchstaben. Der Aufruf von "new getHandler()" verwirrt deshalb jeden Java-Entwickler!

Webster schrieb:
Ich weiß nicht warum, aber der Handler wird mit getHandler nicht über den TimerTask erstellt. Ohne funktioniert es :confused:

Also der Aufruf von "GetDataFromServerThread(new getHandler());" funktioniert außerhalb des Threads?
 
garak schrieb:
Inline-Klassen nur wenn absolut nötig, Klassennamen beginnen immer mit einem Großbuchstaben, Methoden und Variablennamen immer mit einem Kleinbuchstaben. Der Aufruf von "new getHandler()" verwirrt deshalb jeden Java-Entwickler!

Danke für dein Feedback. Ich werde versuchen mich an die Konventionen zu halten.

OK, nun zu meinem Problem. Ich habe inzwischen weiter gesucht und habe herausgefunden, dass ich keinen zusätzlichen Thread brauche, da der Service ja bereits im Hintergrund läuft. Somit kann ich mit folgender Funktion leicht periodisch meine Daten im Service abfragen,

Code:
    private void startservice(){
    	
    	timer.scheduleAtFixedRate( new TimerTask(){

			@Override
			public void run() {
				// Daten abfragen
			}
    	}, delay, period);
    }
 
Warum nimmst du anstatt eines Threads nicht einen zweiten Service? Den kannst du ja von außen starten und stoppen, so wie du ihn brauchst.

Also dein erster Service hat den Timer und ruft periodisch den zweiten Service auf. Das könnte m.E. besser funktionieren.
 
Meine erste Programmiersprache ist zwar BASH, aber einen zweiten Service finde ich in dieser Stelle overdosed.
Ein Netzwerk-Service, der alle paar Minuten Daten holt, ist hier voll OK.
Ich habe mal gelesen, dass man bei Android nicht zu viele Objekt erstellen soll, damit die Anwendung schlank und schnell bleibt. Aus diesem Grund ist mir hier der Funktionsaufruf anstatt eines Services lieber.
 
Du bist hier aber in einer anderen Umgebung und solltest dich darauf einstellen. Ein Service kann von Android jederzeit gecancelt werden, egal aus welchem Grund. Ein Thread hingegen nicht. Außerdem erzeugts du ja jedesmal einen neuen Thread, d.h. es ist lange nicht so Ressourcen schonend, wie ein Service.

Überlege dir mal, was ein Service ist: ein Programm, welches ohne grafische Oberfläche auskommt und nur dann gestartet wird, wenn es benötigt wird. D.h. nur ein Objekt, absolut sparsam!

Ein Thread ist ein Teil eines Programms, der wenn er gestartet wird, jedesmal ein neues Programm erzeugt. Dass werden sehr viele Programme und ist nicht sehr sparsam!

Wenn du dass mit dem Thread doch so programmieren willst, dann darfst du ihn nur einmal erzeugen und musst ihn, nachdem er seine Arbeit verrichtet hat, wieder schlafen schicken. Soll er wieder aktiv werden, aufwecken. Und vergiss nicht, das Ganze muss synchronisiert werden, sonst fliegt es dir über kurz oder lang um die Ohren.

Gruß
Chris
 
garak schrieb:
Du bist hier aber in einer anderen Umgebung und solltest dich darauf einstellen...
Das tue ich jeden Tag ;-)

Ich habe es mit einem Service umgesetzt, da es sich immer um die selben Daten handelt, die abgefragt werden. Zusätzlich habe ich das Ganze mit Semaphore geschützt, dass es nicht mehrfach aufgerufen wird. Natürlich schläft der Thread in der Zeit, in der ich Ihn nicht brauche. Somit bleibt das App "meines Erachtens" schön schlank.
 

Ähnliche Themen

5
Antworten
22
Aufrufe
1.418
590239
5
D
  • djsnoopy
Antworten
6
Aufrufe
614
djsnoopy
D
M
Antworten
3
Aufrufe
151
moin
M
Zurück
Oben Unten