1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Timer im Service der ein Thread erstellt

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Webster, 21.01.2010.

  1. Webster, 21.01.2010 #1
    Webster

    Webster Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    388
    Erhaltene Danke:
    21
    Registriert seit:
    10.08.2009
    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
     
  2. garak, 21.01.2010 #2
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    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
     
  3. Webster, 21.01.2010 #3
    Webster

    Webster Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    388
    Erhaltene Danke:
    21
    Registriert seit:
    10.08.2009
    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:
     
  4. garak, 21.01.2010 #4
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    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!

    Also der Aufruf von "GetDataFromServerThread(new getHandler());" funktioniert außerhalb des Threads?
     
  5. Webster, 21.01.2010 #5
    Webster

    Webster Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    388
    Erhaltene Danke:
    21
    Registriert seit:
    10.08.2009
    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);
        }
    
     
  6. garak, 21.01.2010 #6
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    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.
     
  7. Webster, 22.01.2010 #7
    Webster

    Webster Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    388
    Erhaltene Danke:
    21
    Registriert seit:
    10.08.2009
    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.
     
  8. garak, 22.01.2010 #8
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    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
     
  9. Webster, 22.01.2010 #9
    Webster

    Webster Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    388
    Erhaltene Danke:
    21
    Registriert seit:
    10.08.2009
    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.
     

Diese Seite empfehlen