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

Wie startet man einen statischen Thread?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von sem_thesis, 07.06.2011.

  1. sem_thesis, 07.06.2011 #1
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    Hallo!


    Ich versuche einen Thread, der in einer Activity declart wurde, von einem BroadcastReceiver zu starten.
    Eclipse zwingt mich die Deklaration statisch zu machen.

    Deshalb sieht der Code nun folgendermassen aus:
    Code:
    [U]MainActivitiy.java[/U]
    
    public static MyFBDataUpdater updater;
    updater = new MyFBDataUpdater();
    updater.start();
    
    [U]BroadcastReceiver.java[/U]
    
    MyFBDataUpdater myUpdater = HelloUser.updater;
    myUpdater.start();
    
    

    Eclipse zeigt keinen Fehler mehr an, dafür crasht die MainActivity.

    Sieht jemand das Problem?
     
  2. Kranki, 07.06.2011 #2
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Logcat.
     
  3. sem_thesis, 07.06.2011 #3
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One

    Crashgrund scheint die Zeile 133 der HelloUser (MainActivity)-Klasse:
    Code:
    mFacebook.authorize(HelloUser.this, PERMS, new LoginDialogListener());
    

    Der LoginDialogListener() ruft wiederum den Thread auf.
     
  4. the_alien, 08.06.2011 #4
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Dir fehlt eine Klasse im Classpath... wahrscheinlich benutzt du eine Lib von Facebook die nicht mit gepackt wird?

    Ganz davon ab, dass es ziemlich ungut ist in einer GUI Klasse einen Thread zu haben den du über eine nicht GUI Klasse startest...
     
  5. sem_thesis, 08.06.2011 #5
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    Werde ich sofort nachgehen...

    Das habe ich mir gedacht. Am liebsten würde ich den Thread in einem Service laufen lassen.
    Aber die .authorize()-Methode benötigt eine Activity als Eingabe.

    Hm.. was ich aber machen könnte ich Folgendes:
    Innerhalb des LoginListeners nicht den Thread sondern den Facebook-Service aufzurufen, de wiederum den Thread startet...
     
  6. the_alien, 08.06.2011 #6
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Ja, weil die Methode etwas anzeigt. Das geht jetzt doppelt schief:
    1. Wenn du in einem Thread auf die GUI zugreifst wird deine App abstürzen.
    2. Hast du keine Activity in einem BroadcastReceiver zur Verfügung und die App wird abstürzen.
     
  7. sem_thesis, 08.06.2011 #7
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One

    Stimmt - genau das ist passiert :(


    Was soll das?
    Der Token und die Credentials sind doch im Cache. Wieso brauche ich dann eine Activity zu-Hilfe? :(

    Siehst du einen anderen Weg, wie das Login doch automatisiert werden kann?
    Der User, der dann immer nach Bootup in FB einloggen muss, wird sich sonst wirklich abärgern und den Login einfach ignorieren :(
     
  8. the_alien, 08.06.2011 #8
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    sem_thesis bedankt sich.
  9. sem_thesis, 08.06.2011 #9
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    Der Token wird im Framework abgehandelt, also kann ich einfach die Session-Klasse ins Framework hineintun und eine Instanz davon in meiner MainActivity erstellen?


    Ja - du hast ja Recht - ich habe vor 3 Monaten mit Android angefangen... es gibt viel zu lernen :)
     
  10. the_alien, 08.06.2011 #10
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Du kannst das Beispiel 1:1 kopieren und in deine App integrieren. Verstehe dein Problem gerade nicht.
     
  11. sem_thesis, 08.06.2011 #11
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    Die SessionStore-Klasse speichert und gibt mir den Token wieder.

    Aber was soll meine App damit anstellen?
    Token wird im Framework abgehandelt..
     
  12. the_alien, 08.06.2011 #12
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Code:
    Facebook myFacebook = new Facebook();
    SessionStore.restore(myFacebook, getContext());
    myFacebook.get(....);
    
     
  13. sem_thesis, 09.06.2011 #13
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One

    Ich habe eine zeitlang versucht den obigen Code zu verstehen, aber es leuchtet mir immer noch nicht ein, was du mit 'myFacebook.get(....)' genau machst.
    Ich stelle mir die Implementation folgendermassen vor:

    Code:
    Facebook myFacebook = new Facebook();
     mAsyncRunner = new AsyncFacebookRunner(mFacebook);
    
    if (check_if_access_token_available (wie??))
    {
    
                SessionStore.restore(myFacebook, getContext());
                updater = new MyFBDataUpdater();
                updater.start();
    
    }  else {
    
                mFacebook.authorize(MainActivity.this, PERMS, new LoginDialogListener());
    
    }
    
    
    
    private class LoginDialogListener implements DialogListener {
     
            @Override
            public void onComplete(Bundle values) {
    
                updater = new MyFBDataUpdater();
                updater.start();
                SessionStore.save(myFacebook, getContext());
            
            }
    
    }
    
    Stimmt das soweit?
    Wenn ja, wie kann ich überprüfen ob der Token schon da ist?
     
    Zuletzt bearbeitet: 09.06.2011
  14. the_alien, 09.06.2011 #14
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Wie wäre es mit Facebook#getAccessToken() ?
     
  15. sem_thesis, 09.06.2011 #15
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    Ich habe sogar eine bessere Methode gefunden:

    Code:
        /**
         * @return boolean - whether this object has an non-expired session token
         */
        public boolean isSessionValid() {
            return (getAccessToken() != null) &&
                    ((getAccessExpires() == 0) ||
                            (System.currentTimeMillis() < getAccessExpires()));
        }
    
    Ok, nun funktioniert alles perfekt in der MainActivity. Die restore() Funktion erfüllt ihre Aufgabe.


    Jetzt kommen wir zurück zum alten Problem: Wie starte ich jetzt den statischen FB-Thread von der MainActivity?

    Code des BroadcastReceivers:
    Code:
                mFacebook = new Facebook(APP_ID);
                FBSessionHandler.restore(mFacebook, context);
                
                
                if (mFacebook.isSessionValid())
                {
                    
                    MyFBDataUpdater myUpdater = HelloUser.updater;
                    myUpdater.start();                
                    Log.d(TAG, "Started FB again :)");              
    
                }    else    {
                                
                    // Starte MainActivity für FB-Login //
                    Intent fb = new Intent(context, HelloUser.class);
                    fb.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(fb);
                
                }
    
    Die Zeile myUpdater.start() führt zu einem NullPointerException --> App Crash. Was läuft da schief?
     
  16. the_alien, 09.06.2011 #16
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    NPE heißt myUpdater ist null.
    Aber es geht eh nicht über einen Thread wenn du dauerhaft im Hintergrund etwas machen möchtest. Dafür sind Services da. Der Thread lebt nur so lange wie deine Applikation da ist und je nach Speicher ist die schnell weg.
     
    sem_thesis bedankt sich.
  17. sem_thesis, 09.06.2011 #17
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    'Der Thread lebt solange die App lebt'.
    Aber die existert ja noch ?
    Strange.
    Hab's jetzt über einen Service gemacht und es hat perfekt funktioniert.


    Dafür bekomme ich einen komischen Error, wenn ich auf den Login-Button drücke:
    Ist da die key von Facebook oder von meinem Phone gemeint?
    Hat es etwas damit zu tun, dass ich eine FB-App im Hintergrund laufen habe?
    Kollidieren da beide Datenbanken?






    NEW EDIT:

    Habe die Stelle im Framework gefunden, wo das Problem vorkommt.
    https://github.com/facebook/faceboo...cebook/src/com/facebook/android/Facebook.java
    Innerhalb der Facebook#startDialogAuth-Methode gibt's Error-Exception Handling.



    Frage mich bloss, was es bedeutet..
     
    Zuletzt bearbeitet: 09.06.2011
  18. sem_thesis, 09.06.2011 #18
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Phone:
    Nexus One
    Ok, das Problem ist gelöst.
    Siehe Link.

    Das Problem war ein Mismatch zwischen dem auf Facebook-generierten Key und dem App-Signing-Key.
    Ausserdem war das Passwort für den FB-key unbekannt. Habe es dann auf einem anderen StackOverflow Thread gefunden (pwd: android).

    Jaja... die FB Developer-Doku könnte etwas Cleaning vertragen..

    Danke die the_alien.
    Hast mir echt geholfen :thumbsup:
     

Diese Seite empfehlen