2015-07-09 5 views
11

So hat meine Android-App die folgenden Komponenten: eine LoginActivity, eine MainActivity, die eine Navigationsschublade, eine Reihe von verschiedenen Fragmenten, die von der Nav-Schublade in Main Activity behandelt.Re-Initialisierung von Twitter Fabric nach langer Idle-Zeit Android-App

Im LoginActivity, habe ich TwitterAuthConfig und füttern auch, dass in Fabric.with (.... Twitter (authconfig) ...), im Grunde tun, was sie sagen, in der Dokumentation zu tun: Fabric integration documentation

Nachdem der Benutzer durch LoginActivity navigiert und sich erfolgreich eingeloggt hat, wird die Hauptaktivität aufgerufen, die die Navigationsleiste öffnet und es ihnen ermöglicht, das gewünschte Fragment auszuwählen. Die LoginActivity ruft nach dem Start der MainActivity this.finish() auf.

Mein Problem ist, dass eines der Fragmente, die ich habe, eine Embedded Twitter Timeline verwendet, die Fabric Authentifizierung über den Fabric.with() Aufruf benötigt. Das funktioniert fein das erste Mal, aber sobald ich die App verlassen und es bleibt im Hintergrund für eine Weile, ich glaube onDestroy() wird aufgerufen und dann die Fabric-Instanz entfernt.

Deshalb, wenn ich es öffne wieder zurück aus dem Hintergrund, hat es die folgenden Fehler:

07-09 15:59:55.179 7933-7933/com.writers.myapp E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.writers.myapp, PID: 7933 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.writers.myapp/com.writers.myapp.MainActivity}: java.lang.IllegalStateException: Must Initialize Fabric before using singleton() 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2329) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 
     at android.app.ActivityThread.access$900(ActivityThread.java:147) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 
Caused by: java.lang.IllegalStateException: Must Initialize Fabric before using singleton() 
     at io.fabric.sdk.android.Fabric.singleton(Fabric.java:265) 
     at io.fabric.sdk.android.Fabric.getKit(Fabric.java:516) 
     at com.twitter.sdk.android.tweetui.TweetUi.checkInitialized(TweetUi.java:120) 
     at com.twitter.sdk.android.tweetui.TweetUi.getInstance(TweetUi.java:69) 
     at com.twitter.sdk.android.tweetui.TwitterListTimeline$Builder.<init>(TwitterListTimeline.java:108) 
     at com.myapp.newstimeline.TimelineFragment.onCreateView(TimelineFragment.java:49) 
     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1120) 
     at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1929) 
     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547) 
     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220) 
     at android.app.Activity.performStart(Activity.java:5949) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 
     at android.app.ActivityThread.access$900(ActivityThread.java:147) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 
07-09 15:59:55.203  775-1192/? W/ActivityManager﹕ Force finishing activity com.writers.myapp/.MainActivity 

Jede Idee, wie man dieses Problem zu beheben?

  • Sollte ich eine zusätzliche Fabric.with() -Anweisung in MainActivity hinzufügen?
  • Sollte ich IllegalStateException abfangen? Wenn ja, wo?
  • Mache ich das alles falsch?

Vielen Dank für Ihre Hilfe im Voraus!

Antwort

4

Fabric hat eine statische Methode namens isInitialized(). Die Lösung besteht also darin, vor dem Laden der Twitter-Timeline zu überprüfen, ob Fabric initialisiert ist.

Beispiel:

if (!Fabric.isInitialized()) { 
    TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY,TWITTER_SECRET); 
     Fabric.with(getActivity(), new Twitter(authConfig)); 
    } 

// load Twitter Timelines   
10

Ich würde vorschlagen, dass Sie eine BaseActivity haben und alle Ihre Aktivitäten, die BaseActivity verlängern machen.

in onCreate Funktion dieser Basis, initialisieren Fabric Beispiel, wenn es nicht so initialisiert wird:

public class BaseActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (!Fabric.isInitialized()) { 
     Fabric.with(....Twitter(authConfig)...) 
    } 
    //Do other stuff. 
} 

diese Weise können Sie dafür sorgen, dass es immer initialisiert wird.

Verwandte Themen