有一个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了。