Wie startet man einen statischen Thread?

S

sem_thesis

Fortgeschrittenes Mitglied
0
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?
 
Logcat.
 
E/dalvikvm( 1468): Could not find class 'com.facebook.android.FacebookError', referenced from method com.facebook.android.Facebook$1.onComplete
W/dalvikvm( 1468): VFY: unable to resolve new-instance 87 (Lcom/facebook/android/FacebookError;) in
Lcom/facebook/android/Facebook$1;
D/dalvikvm( 1468): VFY: replacing opcode 0x22 at 0x005f
D/dalvikvm( 1468): VFY: dead code 0x0061-0069 in
Lcom/facebook/android/Facebook$1;.onComplete (Landroid/os/Bundle;)V
W/dalvikvm( 1468): VFY: unable to find class referenced in signature
(Lcom/facebook/android/DialogError;)
W/dalvikvm( 1468): VFY: unable to find class referenced in signature
(Lcom/facebook/android/DialogError;)
W/dalvikvm( 1468): VFY: unable to find class referenced in signature
(Lcom/facebook/android/FacebookError;)
W/dalvikvm( 1468): VFY: unable to find class referenced in signature
(Lcom/facebook/android/FacebookError;)
D/AndroidRuntime( 1468): Shutting down VM
W/dalvikvm( 1468): threadid=1: thread exiting with uncaught exception
(group=0x40015560)
E/AndroidRuntime( 1468): FATAL EXCEPTION: main
E/AndroidRuntime( 1468): java.lang.NoClassDefFoundError:
com.facebook.android.Util
E/AndroidRuntime( 1468): at
com.facebook.android.Facebook.dialog(Facebook.java:620)
E/AndroidRuntime( 1468): at
com.facebook.android.Facebook.startDialogAuth(Facebook.java:297)
E/AndroidRuntime( 1468): at
com.facebook.android.Facebook.authorize(Facebook.java:195)
E/AndroidRuntime( 1468): at
com.facebook.android.Facebook.authorize(Facebook.java:114)
E/AndroidRuntime( 1468): at
com.project.socialmine.HelloUser$1.onClick(HelloUser.java:133)
E/AndroidRuntime( 1468): at android.view.View.performClick(View.java:2485)
E/AndroidRuntime( 1468): at
android.view.View$PerformClick.run(View.java:9080)
E/AndroidRuntime( 1468): at
android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 1468): at
android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 1468): at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime( 1468): at
android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime( 1468): at
java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1468): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 1468): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime( 1468): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime( 1468): at dalvik.system.NativeStart.main(Native Method)


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


Der LoginDialogListener() ruft wiederum den Thread auf.
 
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...
 
the_alien schrieb:
Dir fehlt eine Klasse im Classpath... wahrscheinlich benutzt du eine Lib von Facebook die nicht mit gepackt wird?
Werde ich sofort nachgehen...

the_alien schrieb:
Ganz davon ab, dass es ziemlich ungut ist in einer GUI Klasse einen Thread zu haben den du über eine nicht GUI Klasse startest...
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...
 
sem_thesis schrieb:
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...

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.
 
the_alien schrieb:
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.


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 :(
 
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 :)
 
Du kannst das Beispiel 1:1 kopieren und in deine App integrieren. Verstehe dein Problem gerade nicht.
 
Die SessionStore-Klasse speichert und gibt mir den Token wieder.

Aber was soll meine App damit anstellen?
Token wird im Framework abgehandelt..
 
Code:
Facebook myFacebook = new Facebook();
SessionStore.restore(myFacebook, getContext());
myFacebook.get(....);
 
the_alien schrieb:
Code:
Facebook myFacebook = new Facebook();
SessionStore.restore(myFacebook, getContext());
myFacebook.get(....);


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:
Wie wäre es mit Facebook#getAccessToken() ?
 
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?
 
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.
 
  • Danke
Reaktionen: sem_thesis
'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:
I/ActivityManager( 96): Starting: Intent { cmp=com.facebook.katana/.ProxyAuth (has extras) } from pid 1931
I/ActivityManager( 96): Displayed com.facebook.katana/.ProxyAuth: +321ms
D/Facebook-authorize( 1931): Login failed: invalid_key
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:
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:
 

Ähnliche Themen

M
Antworten
3
Aufrufe
140
moin
M
L
Antworten
15
Aufrufe
905
jogimuc
J
H
Antworten
0
Aufrufe
608
Hcman
H
Zurück
Oben Unten