在activity.onServiceConnected之前的片段娱乐给了我一个NPE

时间:2014-08-22 21:51:28

标签: android android-fragments service rotation

我的一个片段有一个listview,可以在片段生命周期开始时从我的服务中获取适配器。在正常的生命周期中,它没有问题,但是当我旋转设备时,即使在活动重新创建之前,也会重新显示正在显示的片段,因此我的活动上的服务实例尚未就绪,它仅在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);

}

1 个答案:

答案 0 :(得分:0)

即使活动被销毁,也会保留或保存片段实例。这就是我通过在我的活动OnGlobalLayoutListener中添加onCreate来解决类似问题的方法。您的问题可能会有所不同,因此您可以在onGlobalLayout中绑定服务,并且在调用onServiceConnected时,您的片段应该可以使用了。

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);
        }
    } );