簡體   English   中英

Activity.onServiceConnected之前的片段重新創建給了我NPE

[英]Fragment recreation before activity.onServiceConnected gives me a NPE

我的一個片段具有一個列表視圖,該片段列表開始時會從我的服務中獲取他的適配器。 在正常的生命周期中,它沒有問題,但是當我旋轉設備時,顯示的片段甚至在活動重新創建之前就被重新創建,因此我在活動上的服務實例尚未准備好,僅在onServiceConnected()之后才准備就緒。 即使我嘗試恢復並在fragment.onResume()中設置此適配器,也無法保證該服務已被綁定。 在我的代碼中,我負責在方向更改后(在onServiceConnected()之后)添加片段,但是片段生命周期不遵守此順序。 為什么在活動之前重新創建片段?

我該怎么辦?

活動:

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

    setContentView(R.layout.activity_layout);

    actionBar = getSupportActionBar();
    drawerlayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerlayout.setDrawerShadow(R.drawable.drawer_shadow,
            GravityCompat.END);

    Intent it = new Intent(this, MyService.class);

    if (!MyService.RUNNING) {

        startService(it);
    }

    bindService(it, this, 0);

}

@Override
public void onServiceConnected(ComponentName name, IBinder binderservice) {
    Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
            "Activity onServiceConnected");
    LocalBinder binder = (LocalBinder) binderservice;
    this.service = binder.getService();

    //load a fragment with a radio player
    carregaRadio(); 

    if (!service.isIRCConnected()) {

    // load a fragment to login on a chat
        carregaLogin();

    } else {

   // load fragments according to the chat
   // variables on the service when service was already
   // running before activity creation.

   carregaChatdoService(); 


    }

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

}

即使活動被銷毀,片段實例也會保留或保存。 這就是我通過在活動onCreate添加OnGlobalLayoutListener來解決類似問題的方式。 你的問題可能會有點不同,所以你可以綁定在服務onGlobalLayoutonServiceConnected被調用時,你的片段應該是隨時可以使用。

viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Log.d("Activity", "onGlobalLayout");

            if ( musicService != null)
                tabPagerAdapter.getPlaylistFragment().loadPlaylist(musicService.getPlaylist());

            viewPager.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    } );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM