2015-07-09 15 views
11

Vì vậy, ứng dụng Android của tôi có các thành phần sau: LoginActivity, MainActivity sử dụng Ngăn kéo điều hướng, một loạt các phần khác nhau được xử lý bởi Ngăn kéo điều hướng trong Hoạt động chính.Tái khởi tạo Vải Twitter sau khi ứng dụng android thời gian nhàn rỗi

Trong LoginActivity, tôi thiết lập TwitterAuthConfig và cũng thức ăn đó vào Fabric.with (.... Twitter (authConfig) ...), về cơ bản làm những gì họ nói để làm trong tài liệu: Fabric integration documentation

Sau khi người dùng điều hướng thông qua LoginActivity và đăng nhập thành công, nó sẽ chuyển đến Main Activity, mở ngăn điều hướng và cho phép họ chọn Fragment mà họ muốn truy cập. LoginActivity gọi this.finish() sau khi khởi động MainActivity.

Vấn đề của tôi là một trong những Mảnh vỡ tôi đã sử dụng Dòng thời gian Twitter được nhúng cần xác thực vải thông qua lệnh Fabric.with(). Điều này làm việc fine lần đầu tiên, nhưng một khi tôi rời khỏi ứng dụng và nó vẫn ở chế độ nền trong một thời gian, tôi tin onDestroy() được gọi và sau đó thể hiện Fabric bị xóa.

Vì vậy, khi tôi mở nó lại lên một lần nữa từ phía sau, nó có báo lỗi sau:

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 

Bất kỳ ý tưởng làm thế nào để khắc phục vấn đề này?

  • Tôi có nên thêm tuyên bố Fabric.with() vào MainActivity không?
  • Tôi có nên bắt IllegalStateException không? Nếu vậy, ở đâu?
  • Tôi có làm điều này sai không?

Cảm ơn sự giúp đỡ của bạn trước!

Trả lời

4

Vải có phương thức tĩnh gọi là isInitialized(). Vì vậy, giải pháp là để kiểm tra xem vải được khởi tạo trước khi tải Twitter Timeline.

Ví dụ:

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

// load Twitter Timelines   
10

tôi sẽ đề nghị bạn để có một BaseActivity và làm cho tất cả hoạt động của bạn mở rộng mà BaseActivity.

trong onCreate chức năng của cơ sở đó, khởi Fabric dụ nếu nó không được khởi tạo như thế này:

public class BaseActivity extends Activity { 

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

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

Bằng cách đó bạn sẽ đảm bảo rằng nó luôn luôn được khởi tạo.

Các vấn đề liên quan