Подтвердить что ты не робот

Повторная инициализация Твиттера после долгого андроида

Итак, у моего Android-приложения есть следующие компоненты: LoginActivity, MainActivity, который использует навигационный ящик, кучу различных фрагментов, которые обрабатываются Nav Drawer в главной операции.

В LoginActivity я настроил TwitterAuthConfig и также передал его в Fabric.with(.... Twitter (authConfig)...), в основном делая то, что они говорят в документации: Документация по интеграции Fabric

После того, как пользователь перейдет через LoginActivity и успешно войдет в систему, он переходит в главную активность, которая открывает навигационный ящик и позволяет им выбирать, к какому фрагменту они хотят перейти. LoginActivity вызывает this.finish() после запуска MainActivity.

Моя проблема заключается в том, что у одного из фрагментов, которые у меня есть, используется встроенная таймаут Twitter, для которой требуется аутентификация Fabric через вызов Fabric.with(). Это работает отлично в первый раз, но как только я покидаю приложение, и он остается в фоновом режиме некоторое время, я считаю, что 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

Любая идея, как решить эту проблему?

  • Должен ли я добавлять дополнительный оператор Fabric.with() в MainActivity?
  • Должен ли я поймать IllegalStateException? Если да, то где?
  • Я делаю все это неправильно?

Спасибо за вашу помощь заранее!

4b9b3361

Ответ 1

Я предлагаю вам иметь 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. 
}

Таким образом вы убедитесь, что он всегда инициализирован.

Ответ 2

Ткань имеет статический метод, называемый isInitialized(). Таким образом, решение состоит в том, чтобы проверить, инициализирована ли ткань, прежде чем загружать временную шкалу Twitter.

Пример:

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

// load Twitter Timelines