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

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    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

    Logcat.
     
  3. sem_thesis, 07.06.2011 #3
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied


    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

    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

    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

    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


    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

    sem_thesis gefällt das.
  9. sem_thesis, 08.06.2011 #9
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    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

    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

    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

    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


    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

    Wie wäre es mit Facebook#getAccessToken() ?
     
  15. sem_thesis, 09.06.2011 #15
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    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

    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 gefällt das.
  17. sem_thesis, 09.06.2011 #17
    sem_thesis

    sem_thesis Threadstarter Android-Hilfe.de Mitglied

    '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

    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:
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[OFFEN] The application may be doing too much work on its main thread Android App Entwicklung 01.11.2017
[OFFEN] App startet nicht... Android App Entwicklung 10.09.2017
[ERLEDIGT] AVD startet nicht unter Linux Android App Entwicklung 05.06.2017
[ERLEDIGT] Navigation Drawer stürzt ab nach dem schchließen durch thread Android App Entwicklung 13.03.2017
Buttonfarbe ständig wechseln Android App Entwicklung 06.01.2017
Du betrachtest das Thema "Wie startet man einen statischen Thread?" im Forum "Android App Entwicklung",