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