长时间闲置后重新初始化Twitter Fabric的Android应用程序

12

我的Android应用有以下组件:一个 LoginActivity,一个使用导航抽屉的 MainActivity,一堆不同的片段由 Nav Drawer 在 MainActivity 中处理。

在 LoginActivity 中,我设置了 TwitterAuthConfig,并将其传递给 Fabric.with(....Twitter(authConfig)...), 基本上按照文档所说进行操作:Fabric 集成文档

用户完成 LoginActivity 并成功登录后,它会转到打开导航抽屉并让他们选择要前往哪个 Fragment 的 MainActivity。 LoginActivity 在启动 MainActivity 后调用了 this.finish()

我的问题是,我其中一个 Fragment 使用了嵌入式 Twitter 时间线,需要通过 Fabric.with() 调用进行 Fabric 认证。这第一次工作得非常好,但是一旦我离开应用程序并在后台停留一段时间,我认为 onDestroy() 被调用,然后 Fabric 实例被删除。

因此,当我再次从后台打开它时,它会出现以下错误:

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

你有什么想法来解决这个问题吗?

  • 我是否应该在MainActivity中添加一个额外的Fabric.with()语句?
  • 我是否应该捕获IllegalStateException?如果是的话,应该在哪里捕获?
  • 我是不是完全错了?

提前感谢你的帮助!

2个回答

11

我建议您创建一个BaseActivity,并使所有的Activity都继承自该BaseActivity

在该基类的onCreate函数中,如果还未初始化,请按照以下方式初始化Fabric实例:

public class BaseActivity extends Activity {

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

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

那样你就可以确保它始终被初始化。


6

Fabric有一个名为isInitialized()的静态方法。因此,在加载Twitter时间线之前,解决方案是检查是否已初始化fabric。

示例:

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

// load Twitter Timelines        

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接