早上代码出了点问题,排查了一个下午,大概知道了问题出在哪几行代码,但是左看右看找不到原因,单位前辈帮忙,第一次经历了log排查错误原因,感受到了代码的排错的魅力。
不能进行断点,所以只能一步步来log打印。谢谢前辈。
首先我发现注释掉下面几行代码就没有问题了,
val sceneDataList: ArrayList<SceneData> = ArrayList()
val sceneData = SceneData()
sceneData.sceneName = it.sceneName
sceneData.desc = it.sceneDesc
sceneData.sid = it.id
sceneDataList.add(sceneData)
if(sceneDataList.isNotEmpty()) {
mSmartSceneDatabase?.scenesDao()?.deleteAll()
mSmartSceneDatabase?.scenesDao()?.insert(sceneDataList)
}
我看了sceneData中的结构,从数据库中获取一个表,然后读取值,
@Entity(tableName = "scenes", indices = [Index(value = ["sid"], unique = true)])
看起来并没有什么问题,我只是新建一个list然后在其中插入sceneData的数据,如果sceneDataList不为空,更新
mSmartSceneDatabase?.scenesDao()
scenesDao是别人定义好的,里面的东西用过不少次,别的地方都没有出问题,我感觉这里理应也不会有什么不一样的,然后我就很懵逼了,这啥玩意。
大佬来了,开始log教学。
LogUtil.e(TAG, "sceneBeanList = $sceneBeanList")
第一个log查看这个类最后返回的数据,显然是有数据的,所以服务器传过来的数据没有问题,
然后查看senesDao中的数据,也没有问题,里面的东西我连改都没改过。
然后大佬查看这个数据的应用的activity,
CategoryActionModel中用的,
getList(categoryId, pageNo, pageSize)
调了三个参数,这三个参数好像也和我写的没什么关系,因为用的是mvp模式,所以找到了这个model所用的加载,
CategoryScenePresenter
数据在其中请求,
// 检测是否绑定 View
checkViewAttached()
mRootView?.showLoading()
val disposable = mModel.getSceneList(categoryId, pageNo, pageSize)
.subscribe({ list ->
mRootView?.apply {
dismissLoading()
setCategorySceneData(list)
}
}, { t ->
LogUtil.e(TAG, "requestSceneData ...")
mRootView?.apply {
dismissLoading()
showError(ExceptionHandle.handleException(t), ExceptionHandle.errorCode)
}
})
由于报错的加载不出来的数据有错误显示,所以判断可能在这出的问题,log一下,发现确实在这里被判断出错异常,进入下面的判断逻辑,导致出错。
于是进入其fragment中看看,
mPresenter.loadMoreData(mCategoryId, mPageNo, mPageSize)
通过懒加载的方式,选择categoryId来的,将cateid写死,看了一下是不是其他页面对这个页面造成了影响,因为sceneData是几个页面异步公用的。发现只单独加载出问题的那一个页面还是出问题,排除了其他页面的影响。
showError(ExceptionHandle.handleException(t), ExceptionHandle.errorCode)
在showError里查看,得到问题所在
errorMsg = "参数错误"
参数错误的问题原因。但还是不知道问题出在哪里,查看sceneData中的数据,大佬怀疑是string类型的数据是不是可能直接定义为null造成空指针之类的问题,先改了吧,发现不是。
int类型我给赋值了个null,
var ruleType: Int? = 0,
改回来赋值为0,还是不对,错误依旧。
对照
scenesBean和sceneData中的数据的类型,发现完全一致,没有问题。
最后:
@PrimaryKey(autoGenerate = true) var id: Int = 0,
大佬发现定义为主键自增的id被我误以为是categoryid之类的页面id
sceneData.sid = it.id
给直接赋值了。
完全没在意这点好吧,被训了一顿好好看看数据库。