【问题标题】:Re-initializing Twitter Fabric after long idle time android app长时间空闲时间后重新初始化 Twitter Fabric android 应用程序
【发布时间】:2015-09-28 13:34:05
【问题描述】:

所以我的 Android 应用有以下组件:一个 LoginActivity、一个使用 Navigation Drawer 的 MainActivity、一堆由 Main Activity 中的 Nav Drawer 处理的各种片段。

在 LoginActivity 中,我设置了 TwitterAuthConfig 并将其输入到 Fabric.with(....Twitter(authConfig)...) 中,基本上按照他们在文档中所说的去做:Fabric integration documentation

在用户通过 LoginActivity 导航并成功登录后,它会转到 Main Activity,它会打开 Navigation Drawer 并让他们选择他们想要去的 Fragment。 LoginActivity 在启动 MainActivity 后调用 this.finish()

我的问题是我拥有的片段之一使用嵌入式 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 吗?如果有,在哪里?
  • 我做错了吗?

提前感谢您的帮助!

【问题讨论】:

    标签: android android-fragments twitter twitter-fabric


    【解决方案1】:

    Fabric 有一个名为 isInitialized() 的静态方法。所以解决方法是在加载 Twitter Timeline 之前检查 Fabric 是否已经初始化。

    例子:

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

    【讨论】:

      【解决方案2】:

      我建议您拥有一个BaseActivity,并让您的所有活动都扩展该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. 
      }
      

      这样您将确保它始终被初始化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 2016-04-08
        • 2020-09-23
        相关资源
        最近更新 更多