[英]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
來解決類似問題的方式。 你的問題可能會有點不同,所以你可以綁定在服務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);
}
} );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.