有一个Activity里面是ViewPager,ViewPager里面放了两个Fragment。
第一次进入这个Activity。开启了服务,并在onResume方法中绑定服务后,对Service进行了一定的初始化,其中调用了Fragment中的一个属性。
super.onResume(); bindService(intent, conn, BIND_AUTO_CREATE); isSee = true; if (currentItem != null) { songName.setText(currentItem.getName()); } if (isPlay) { iv.setImageResource(R.drawable.pause); } if (isPlay) { new Thread() { public void run() { while (binder == null) { try { Thread.sleep(1); } catch (InterruptedException e) { } } new ProgressThread().start(); fragment.initEqualizer();// 可能报空指针,其中fragment不为null。此方法里面就是一句话: // mEqualizer = new Equalizer(0,((MusicActivity)getActivity()).binder.getAudioSessionId()); fragment.mVisualizer.setEnabled(true); binder.setHandler(handler); handler .sendEmptyMessage(MusicActivity.INIT_LRC); } }.start(); }
第一次进入这个Activity很正常,返回后再进入就报空指针。
找了很久也不知道谁是null,后来发现只可能是getActivity(),可是第一次很正常,第二次才出错。
解决办法:
activity的生命周期执行完onResume之后,Fragment才开始被初始化。所以在线程中对fragment操作的时候,Fragment压根没和Activity绑定。
至于为什么第一次正常,没找到原因。
所以把要对binder设置的属性,放到fragment的onResume里面。
@Override public void onResume() { super.onResume(); if (MusicActivity.isPlay) { new Thread() { public void run() { while (((MusicActivity) getActivity()).binder == null) { try { Thread.sleep(1); } catch (InterruptedException e) { } } setMax(((MusicActivity) getActivity()).binder.getLength()); ((MusicActivity) getActivity()).pb .setMax(((MusicActivity) getActivity()).binder .getLength()); setProgress(((MusicActivity) getActivity()).binder .getCurrent()); ((MusicActivity) getActivity()).pb .setProgress(((MusicActivity) getActivity()).binder .getCurrent()); initEqualizer(); mVisualizer.setEnabled(true); ((MusicActivity) getActivity()).binder.setHandler(handler); ((MusicActivity) getActivity()).handler .sendEmptyMessage(MusicActivity.INIT_LRC); } }.start(); } }
就没null了。
相关推荐
`Fragment`有自己的`onCreate()`, `onCreateView()`, `onResume()`, `onPause()`, `onDestroyView()`, `onDestroy()`等生命周期方法,它们与`Activity`的生命周期相协调。在`ViewPager`中,当`Fragment`被显示或隐藏...
- **Fragment的生命周期**:Fragment有自己的生命周期,包括`onCreate()`, `onCreateView()`, `onActivityCreated()`, `onStart()`, `onResume()`, `onPause()`, `onStop()`, `onDestroyView()`, `onDestroy()` 和 ...
5. **生命周期管理**:由于Fragment嵌套在ViewPager中,它们的生命周期会受到Activity和ViewPager的影响。理解并正确处理Fragment的生命周期方法(如`onCreate()`, `onResume()`, `onPause()`等)是确保应用性能和...
`Fragment`有自己的生命周期,并且可以拥有自己的视图层次结构。它们是构建模块化应用程序的关键,因为一个Activity可以包含多个Fragment,这样可以更方便地管理和更新界面。在`ViewPager`中使用`Fragment`,每个`...
4. **处理Fragment的生命周期**:由于Fragment的生命周期与Activity紧密相关,因此需要确保在适当的时候保存和恢复Fragment的状态,特别是在设备旋转等情况下。 5. **优化用户体验**:为了提供更佳的用户体验,可以...
最后,Fragment是Android中的一个核心组件,它是Activity的一部分,可以独立存在或者与其他Fragment组合,用于创建动态和灵活的用户界面。在仿微信的场景中,每个Fragment通常代表一个特定的功能或内容,如聊天窗口...
`Fragment`有自己的生命周期和UI,可以独立于Activity存在。在`ViewPager`中,每个`Fragment`对应一个页面,它们可以在用户滑动时被创建和销毁,以节省内存。 在`Fragment`中,我们通常会定义一个布局文件,并在`...
3. **处理生命周期**:当`Fragment`中的`ViewPager`有自己的`Fragment`时,需要特别注意`Fragment`的生命周期。例如,当外部`ViewPager`切换页面时,内部`Fragment`可能会被销毁和重建,因此需要确保数据的保存和...
在Android应用开发中,"ViewPager+Fragment实现仿QQ选项卡"是一种常见的设计模式,用于创建一个界面,其中用户可以通过滑动在多个视图之间切换,每个视图通常代表不同的功能或内容区域。这个设计灵感来源于QQ应用的...
`Fragment`有自己的生命周期,并且可以与其他`Fragment`或`Activity`进行通信。在`ViewPager`和`Fragment`的结合使用中,`Fragment`可以包含复杂的视图结构,使得用户可以在滑动时体验到平滑的页面过渡。 接下来,...
`Fragment`有自己的生命周期,可以与Activity交互,并处理用户输入和响应事件。在`ViewPager`中使用`Fragment`,可以为每个页面提供不同的功能和视图,使得应用具有更丰富的交互体验。 接下来,`RecyclerView`是...
`Fragment`是Android应用中的一个可重用的UI组件,它可以嵌入到Activity中,有自己的生命周期和UI布局。在分页滑动的场景中,每个`Tab`通常对应一个`Fragment`,这样每个页面都有独立的数据和视图管理。 现在,让...
`Fragment`有自己的生命周期,可以独立于Activity进行管理,这样可以提高代码的可维护性和复用性。在`ViewPager`中使用`Fragment`,需要通过适配器的`instantiateItem()`方法实例化每个`Fragment`并添加到`ViewPager...
Fragment有自己的生命周期,并且可以与Activity交互。在创建Fragment时,需要定义布局并在`onCreateView()`方法中返回,同时处理用户交互事件。 **3. RadioGroup** RadioGroup是Android中管理RadioButton的容器,...
在`ViewPager`与`Fragment`的结合使用中,每个`Fragment`通常有自己的生命周期和回调方法,如`onCreateView()`, `onResume()` 和 `onPause()`等,这些回调方法会根据用户在`ViewPager`中的滑动行为进行调用。...
2. **创建Fragment**:`Fragment`是Android中的一个可重用的UI组件,它可以有自己的布局和生命周期。在本例中,我们需要为每个页面创建一个`Fragment`子类,每个子类负责自己的数据加载和UI呈现。 3. **设置Adapter...
同时,为了防止内存泄漏,确保正确处理`Fragment`的生命周期,特别是当`Fragment`被回收时,取消网络请求或订阅。 此外,为了使无限加载更平滑,我们可以采用分页加载策略,每次只加载一部分数据,减少一次性加载...
`Support13Demos`项目可能包含了一系列不同类型的示例,涵盖了各种情况下的`ActionBarTabs+ViewPager+Fragment`实现,例如:动态添加Tab、处理Tab和Fragment的生命周期、处理配置变更等。这些例子有助于开发者了解和...
- 动态操作时,要处理好`Fragment`的生命周期,避免因未正确销毁导致的问题。 - 如果有数据绑定,确保在添加或删除`Fragment`时更新数据源,以保持数据和视图的一致性。 6. **Viewpagertest项目** 在名为`...
Fragment还可以有自己的生命周期方法,方便管理各自的逻辑和状态。 在实现QQ界面的过程中,首先需要创建一个包含多个Fragment的PagerAdapter子类,这是ViewPager的数据源。PagerAdapter会根据需要加载并返回对应的...