一、报错
Attempt to invoke virtual method 'android.view.Window android.app.Activity.getWindow()' on a null object reference
报错的项目来源于b站:Android实战练习--超简单网络视频播放器
二、原因
在VideoAdapter.java文件代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_mainlv,parent,false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
// 获取指定位置的数据源
String path = "xxxx";
holder.jzvdStd.setUp(path,"test",JzvdStd.SCREEN_NORMAL);
holder.jzvdStd.positionInList = position;
return convertView;
}
class ViewHolder{
JzvdStd jzvdStd;
public ViewHolder(View view){
jzvdStd = view.findViewById(R.id.item_main_jzvd);
}
}
由于jzvdStd在全屏切为小屏时,已经释放了jzvdStd窗口,而后续的 if (convertView == null)判断中,直接到else语句,所以已经释放的窗口无法被else中的语句在获得窗口,所以报错。(以上是个人见解)
三、解决方案
用以下的代码,替换上述的代码
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (null == convertView) {
viewHolder = new ViewHolder();
LayoutInflater mInflater = LayoutInflater.from(context);
convertView = mInflater.inflate(R.layout.item_mainlv, null);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.jzvdStd = convertView.findViewById(R.id.item_main_jzvd);
// 获取指定位置的数据源
String path = "xxx";
viewHolder.jzvdStd.setUp(path,"test",JzvdStd.SCREEN_NORMAL);
return convertView;
}
class ViewHolder{
JzvdStd jzvdStd;
}