1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. andi86, 10.02.2011 #1
    andi86

    andi86 Threadstarter Neuer Benutzer

    Guten Morgen

    Ich habe vor einigen Tagen angefangen meine ersten App's für Android zu entwickeln, nun mein erstes Problem welches mich schon viele Stunden beschäftigt... :winki:

    Es gibt ein Service, der in der Manifest mit intent-filter registriert ist.
    Im OnReceive Teil dieses Services wird nun bei eintreffen des gewünschten Ereignisses ein kleines
    'Toast' angezeigt.

    Soweit so gut...

    In diesem Ereignis sollen später die Koordinaten des GPS gesucht werden.
    Da es das OnReceive Ereignis ja nicht gerne hat, wenn es 2 Minuten mit Arbeit beschäftigt ist,
    wollte ich in der OnReceive einen anderen Service starten.
    Doch ich habe schon alle im Internet entdeckten Möglichkeiten durchprobiert, einen Service zu starten und keine funktioniert.
    Entweder es geschieht einfach nichts oder der Debugger bleibt mit Fehler stehen und ich weiss nicht wie er es gerne hätte.

    Wahrscheinlich mache ich irgendwo einen kleinen Denkfehler...
    Das ganze sollte sich immer jeweils im Hintergrund abspielen, deshalb ein Service.
    Weiss jemand wie so etwas realisiert werden kann?

    Gruss Andi
     
  2. rushzero, 10.02.2011 #2
    rushzero

    rushzero Erfahrener Benutzer

    Lager es doch in einen Thread aus, dann brauchst du keine 2. Service

    Hier mal ein beispiel falls du nicht weißt was ich meine
    Code:
    class DeinService extends ...
    {
    
       Thread t_gps;
       public void OnReceive (...){
          // GPS Daten besorgen
          t_gps = new Thread(new GPSData());
          t_gps.start();
       }
    }
    
    Code:
    class GPSData implements Runnable
    {
       public void run(){
          // GPS Daten besorgen
       }
    }
    
     
    Zuletzt bearbeitet: 10.02.2011
  3. andi86, 10.02.2011 #3
    andi86

    andi86 Threadstarter Neuer Benutzer

    Danke für die schnelle Antwort.

    Soweit scheint das zu funktionieren, zuminest kommt kein Fehler.

    Allerdings wollte ich nun im Thread eine Toast MessageBox auslösen und das passt dem Debugger nicht:

    Code:
     
    Toast.makeText(this, "Test...", Toast.LENGTH_SHORT).show();
    
    The method makeText(Context, CharSeq........) in the type Toast is not applicable for the arguments (GetGPSPos, String, int)

    Stimmt ein Paramter nicht?
     
  4. rushzero, 10.02.2011 #4
    rushzero

    rushzero Erfahrener Benutzer

    Toast.makeText(DeinService.this, "Test...", Toast.LENGTH_SHORT).show();


    oder du gibst der GPSData Klasse mit dem Konstruktor den richtigen Context mit.
     
  5. andi86, 10.02.2011 #5
    andi86

    andi86 Threadstarter Neuer Benutzer

    Selber Fehler, sowohl mit <ServiceName>.this als auch mit <ThreadName>.this

    Andere Idee wo der Fehler liegt?

    Kompletter Code des Threads ist nun folgender:

    Code:
     
    package ch.rodev.test1;
     
    import android.widget.Toast;
     
    public class GetGPSPos implements Runnable {
     
    @Override
    public void run() {
    Toast.makeText(GetGPSPos.this, "GetGPSPos started", Toast.LENGTH_SHORT).show();
    }
     
    }
    
     
  6. rushzero, 10.02.2011 #6
    rushzero

    rushzero Erfahrener Benutzer

    Jo wenn keine InnerClass machst musst halt den Context im Konstruktor oder mittels setter übergeben.

    Du brauchst halt einen richtigen Context
     
    Zuletzt bearbeitet: 10.02.2011
  7. andi86, 10.02.2011 #7
    andi86

    andi86 Threadstarter Neuer Benutzer

    Hm, was heisst einen richtigen Context?

    Das scheint der Punkt zu sein, der mir Probleme macht aber ich nicht weiss was ich denn machen müsste damit ich den richtigen Context bekomme.
     
  8. rushzero, 10.02.2011 #8
    rushzero

    rushzero Erfahrener Benutzer

    Zuletzt bearbeitet: 10.02.2011
  9. andi86, 10.02.2011 #9
    andi86

    andi86 Threadstarter Neuer Benutzer

    Hab schon Stunden gelesen und nun bin ich an einem Punkt wo ich das mal in der Praktik umsetzen möchte um das zu festigen.
    Und die Probleme kommen eben leider erst in der Praktik :winki:

    Kannst du mir für diesen Fall sagen was wohl falsch ist?
    Nur so können sich bei mir allfällige Knöpfe lösen..
     
  10. rushzero, 10.02.2011 #10
    rushzero

    rushzero Erfahrener Benutzer

    Lösung hab ich doch schon gepostet
     
  11. andi86, 10.02.2011 #11
    andi86

    andi86 Threadstarter Neuer Benutzer

    Leider bekomm ich das nicht zum laufen.

    Trotzdem vielen Dank für deine Unterstützung!

    Andi
     
  12. rushzero, 11.02.2011 #12
    rushzero

    rushzero Erfahrener Benutzer

    Dann musst halt mal deinen gesamten Code.. und Logcat meldungen
     
  13. andi86, 11.02.2011 #13
    andi86

    andi86 Threadstarter Neuer Benutzer

    Gerne:

    Service:

    Code:
    package ch.rodev.test1;
    
    import ch.rodev.test1.SUCSrv
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class SUCSrv extends BroadcastReceiver {
    t_gps = new Thread(new GetGPSPos());
    t_gps.start();
    }
    }
    Thread:

    Code:
    package ch.rodev.test1;
    
    import android.widget.Toast;
    
    public class GetGPSPos implements Runnable {
    
    @Override
    public void run() {
    Toast.makeText(GetGPSPos.this, "Test", Toast.LENGTH_SHORT).show();
    }
    }
    Und der Fehler wird beim makeText gemeldet:
    The method makeText(Context, CharSequence, int) in the type Toast is not applicable for the arguments...
     
    Zuletzt bearbeitet: 11.02.2011
  14. rushzero, 14.02.2011 #14
    rushzero

    rushzero Erfahrener Benutzer

    So setzt du deinen Context

    Code:
    package ch.rodev.test1;
    
    import android.widget.Toast;
    
    public class GetGPSPos implements Runnable {
    
     private mContext = null;
    
     public GetGPSPos(Context context){
       this.mContext = context;
     }
    
    @Override
    public void run() {
    Toast.makeText(this.mContext, "Test", Toast.LENGTH_SHORT).show();
    }
    }
    


    Das hier funktioniert nicht, Syntax Fehler eher:
    Code:
    package ch.rodev.test1;
    
    import ch.rodev.test1.SUCSrv
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class SUCSrv extends BroadcastReceiver {
    t_gps = new Thread(new GetGPSPos());
    t_gps.start();
    }
    }
    

    In deinem Service holst dann mit Context | Android Developersden Context und übergibst ihn im Konstruktor.
     
  15. andi86, 17.02.2011 #15
    andi86

    andi86 Threadstarter Neuer Benutzer

    Scheint nun geklappt zu haben :)
    Nun gehts um die Sache mit der GPS Position im Thread..

    Danke für deine Unterstützung!
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[ERLEDIGET] App über href starten Android App Entwicklung 28.09.2017
[ERLEDIGT] Probleme mit Service unter Android N Android App Entwicklung 16.07.2017
[ERLEDIGT] Hilfe bei Fehler in Quellcode benötigt Android App Entwicklung 23.06.2017
[OFFEN] Service wird bei manchen Geräten nicht gestartet Android App Entwicklung 09.04.2017
[ERLEDIGT] Problem beim Starten einer neuen Activity Android App Entwicklung 21.03.2017
Display-Breite zum App-Start auslesen Android App Entwicklung 11.03.2017
adb starten funktioniert nicht Android App Entwicklung 25.02.2017
Bei Erreichbarkeit eines Servers eine APP starten Android App Entwicklung 12.02.2017
Notification in AsyncTask -> crash Android App Entwicklung 11.02.2017
App stürzt bei Start ab Android App Entwicklung 22.12.2016
Du betrachtest das Thema "Service aus Service (BroadcastReceiver) starten" im Forum "Android App Entwicklung",