android activity与viewpager+fragment的生命周期问题

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

你可能感兴趣的