Problem mit Loop im Thread

  • 2 Antworten
  • Letztes Antwortdatum
T

Timm_D.

Neues Mitglied
0
Hallo Community,

ich bin nun schon seit einiger Zeit in der Android-Entwicklung tätig. Ich mache eine Ausbildung als Fachinformatiker - Anwendungsentwicklung und bin momentan an einer App, die später auf die Smartphones unserer Außendienstmitarbeiter soll. Die App startet einen Service auf Knopfdruck, welcher dann die GPS-Koordinaten ausliest und später an unseren WEbserver übermittelt. Aber das kommt später. Momentan werden die Daten noch im externen Speicher meines Smartphones auf einer Datenbank gespeichert.

Nun habe ich damit folgendes Problem.

Bei dieser Version kann der LocationListener nicht aufgerufen werden, da er mir beim Aufruf eine Exception ausgibt. Und zwar:
Cant create Handler inside Thread that has noch called Looper.prepare()

Code:
class Updater extends Thread
	{
		
		public final long schlafe = 10000;
		public void run()
		{
			
			
			GPS gps = new GPS();
			while(isRunning)
			{
			gps.run();
			
			try 
			{
			Thread.sleep(schlafe);
			}
			catch (InterruptedException e) 
			{
			Log.e("Thread sleep", "Wurde aufgrund einer Exception unterbrochen");
			isRunning = false;
			}
			}
		}
	}

Code:
class GPS extends Thread
	{
		
		
		public void run()
		{
			
			final Koordinaten base = new Koordinaten(GPS_Service.this); 
//Neue Instanz der Class Koordinaten, in der SQLiteOpenHelper implementiert ist, um in die Datenbank zu schreiben.		
						//....................................................................................................................................................
						//Einstellen von Datumsformat für die Übertragung
						//....................................................................................................................................................
						
						final SimpleDateFormat datum = new SimpleDateFormat("dd.MM.yyyy");
						final SimpleDateFormat uhrzeit = new SimpleDateFormat("HH:mm:ss");

						
						//....................................................................................................................................................
						//LocationManager locman wird registriert
						//....................................................................................................................................................
						
						final LocationManager locman = (LocationManager)getSystemService(LOCATION_SERVICE);
						

						//....................................................................................................................................................
						//LocationListener wird registriert um veränderungen am Standort zu erfassen
						//....................................................................................................................................................
						
						
						LocationListener loclis = new LocationListener() 
						{

							public void onLocationChanged(Location loc) 
							{
								
								lat = (double)(loc.getLatitude());
								lng = (double)(loc.getLongitude());
								
							
								String string_datum = datum.format(new Date()).toString();
								String string_zeit = uhrzeit.format(new Date()).toString();
								
								try {
									
									String add = "";
									{
										Geocoder geo = new Geocoder(getBaseContext(),Locale.getDefault());
										
										List<Address> addresses = geo.getFromLocation(lat, lng, 1);	
											
										
										
										if(addresses.size() >0)
										{
											for (int i = 0;i<addresses.get(0).getMaxAddressLineIndex();i++)
											{
												add += addresses.get(0).getAddressLine(i) + "\n";
												
											}
											
										}
										
										}
									
									
									Log.v("getGPSData", "wurde ausgeführt");
									base.addGeoKoords(new Aussendienstmitarbeiter(1, lat, lng, "Beliebiger Name", string_datum, string_zeit,add));
									
								} 
								catch (IOException e1) 
								{
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}
								
								

											
							}

							public void onProviderDisabled(String arg0) 
							{
							
							}

							public void onProviderEnabled(String arg0) 
							{
								
							}

							public void onStatusChanged(String arg0, int arg1, Bundle arg2) 
							{					
								
							}
							
							
							
						};
						
						
						try
						{
							Looper.prepare();				
							locman.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, loclis);	
							Looper.loop();	

						}
						catch(Exception e)
						{
							Log.d("Fehler" , e.getMessage().toString());}
		}
	}


Das hab ich auch bereits gemacht, nur führt er mir dann die Methode getGPSData alle 45 Sekunden aus und lässt sich nicht mehr auf Buttonklick (
Code:
Looper.myLooper().quit();
) beenden.

Code:
	@Override
	public synchronized void onDestroy()
	{
		Log.v("Service", "Wurde beendet");
		if (this.isRunning)
		{
		updater.interrupt();
		gps.interrupt();
		isRunning=false;
		}
	}

Es wäre schön wenn mir einer von euch einen Anhaltspunkt geben könnte wie ich das ganze so machen kann, das der Locationlistener alle 10 Minuten seine Updates bekommt und der Looper auch beendet werden kann. Ich habe mir auch schon die Beschreibung der Looper-Klasse angeschaut, nur finde ich dort keinen Hinweis auf diese ominösen 45 Sekunden.

Vielen Dank schonmal im Vorraus
 
bei requestLocationListener hast du doch paramter für die zeit und die entfernung wann die location upgedatet werden soll. warum nutzt du nicht das ?
 
Wenn ich Loop.prepare() aus dem Code raushole, wirft er mich bei requestlocationupdate() aus der app, bzw wirft mir eine Exception raus, die ich aber auch oben beschrieben habe. Wenn ich nun den parameter auf 10 Minuten setze, bleibt es bei den 45 Sekunden und er schreibt wieder in die Datenbank.
 
Zurück
Oben Unten