有一个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了。
相关推荐
但是之前的应用可能最多的是一层 Activity + ViewPager 的 UI 层次,但是随着页面越来越复杂,越来越多的应用首页一个页面外层是一个 ViewPager 内部可能还嵌套着一层 ViewPager,这是之前的懒加载就可能不那么好用...
在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,...另外一个概念就是Fragment和FragmentActivity,Fragment是一个特殊的类,有着和activity一致的生命周期和view一致的界面,也就是
该Demo为Fragment中嵌套(Fragment+ViewPager),在实际的项目中要注意Activity和Fragment的生命周期,以及它们随时可能被销毁的情况。
该DEMO是为了测试activity和fragment的生命周期,以及在viewpager切换过程中,fragment是否会被销毁。
为了实现从Fragment跳转到其他Activity,下面需要创建以下文件: 第一步:简单编写布局文件fragment_activity.xml和抽象类TemplateFragmentActivity.java代码如下: fragment_activity.xml <?xml version=1.0 ...
实现android 底部导航的方式有好几种如:fragment:、TabActivity、ViewGroup、...是重量级的组件,fragment是android里面的片段,是特殊的view,他具备生命周期。 4、ViewGroup : a :属于低级组件。比较麻烦。
1、基于Retrofit2.x及RxJava2.x的网络请求封装、网络请求与生命周期绑定、快速观察者、快速loading观察者、快速返回常用错误 2、 常用功能库二次封装方便调用:Glide加载图片封装、TabLayout+ViewPager Fragment切换...
12.2 fragment生命周期演示 150 12.3ScrollView布局文件 156 12.4 Fragment代码 157 12.5 Activity传值到Fragment 159 12.6 Fragment传值到Activity 162 12.7 Fragment传值到Fragment 164 12.8万能的接口回调 165 ...
基于Retrofit2.x及RxJava2.x的网络请求封装、网络请求与生命周期绑定、快速观察者、快速loading观察者、快速返回常用错误 常用功能库二次封装方便调用:Glide加载图片封装、TabLayout ViewPager Fragment切换封装、...
ViewPager 懒加载:在 Activity 生命周期内仅加载一次,且第一次可见时加载。 LCEE 界面逻辑:也就是加载、内容、错误、空视图。 项目包结构 com.ittianyu.pocenter common 公用代码 a
使用DialogFragment 实现dialog效果 并且可以将ViewPager的每项使用Fragment,Fragment有自己的生命周期,而且碎片化将activity的代码分离,fragment达到复用的效果。非常好用。
周细目基本的Java和枚举基本的Android开发,滑块,片段,可绘制资源Activity和Fragment生命周期,共享首选项,风俗View , Bundle 显式Intent , Intent.putExtra , startActivityForResult ,意图过滤器,隐式...
[Activity和Fragment和Service生命周期] [Handler机制] ViewPager缓存原理 设计模式 [迭代器模式]基本用不到 [备忘模式]很简单、就是有个管理员保存一些对象 [访问者模式] 不常用,不好用,不信你擦擦 [解释器模式] ...