异常一:java.lang.IllegalStateException
Fragment already active and state has been saved
com.wj.fragment.MyFragment.initData(MyFragment.kt:121)
解决办法:onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后
再给它添加Fragment就会出错。解决办法就是把commit()方法替换成 commitAllowingStateLoss()
=====================================================
异常二:
java.lang.IllegalStateException
Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 37 path $.data
错误原因:该异常是由于服务器错误返回的JSON字符串和服务器正常下时返回的JSON字符串结构不同,导致利用Gson解析的时候报了一个异常:本该去解析集合却强制去解析对象所致.
解决办法:在使用Gson解析JSON时try cash一下,不报错按照正常逻辑继续解析,报异常则处理为请求失败逻辑即可.
=====================================================
异常三:
java.lang.NullPointerException
Attempt to invoke virtual method ‘android.support.v7.widget.RecyclerView$ItemAnimator android.support.v7.widget.RecyclerView.getItemAnimator()’ on a null object reference
com.wj.Fragment$mHandler$1.handleMessage(ArticleFragment.kt:52)
该异常表示尝试去调用virtual method,使用了一个空对象引用,建议您检查引用的对象是否为空。
[解决方案]:这种异常通常是调用一个对象的方法抛出的,凡是调用一个对象的方法之前,一定要进行判空或者进行try-catch,这样基本可以规避大部分空指针异常。
在kotlin中可以用符号进行非空监测预防,kotlin中在参数后面加!! 与 ?的区别是:
!!的含义:在kotlin中表示一定不能为空;
?的含义:在kotlin中表示可以为空或者这个对象可能为空;
如:
var str : String? = null 在kotlin中表示可能为空;
var result : Int = str!!.length 在kotlin中表示一定不能为空;
=====================================================
异常四:
You cannot start a load for a destroyed activity
com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134)
[解决方案]:将Glide加载的context对象换成Activity类型,然后在Glide加载的时候做下判断,判断这个activity对象是否销毁,如果销毁则不进行图片加载,注意别用applicationContext,因为用这个的话,你的activity销毁了,但是之前的glide请求还会继续请求,然后你再在别的页面加载图片,图片加载任务就会越积越多,最终就是图片加载缓慢的效果。
我这样写
//adapter里面要成Activity对象类型
private Activity context;
fragment里面给的话,给getActivity()对象就行
if (!context.isDestroyed()){
Glide.with(context)
.load(imgUrl)
.skipMemoryCache(true)
.placeholder(R.drawable.bg_loading_small)
.into(mHolder.item_img);
}
=====================================================
异常五:IllegalStateException: Can not perform this action after onSaveInstanceState:
#解决办法:onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后
再给它添加Fragment就会出错。解决办法就是把commit()方法替换成 commitAllowingStateLoss()
第六项不是异常记录,是关于kotlin的一些语法记录,因为总是容易会记不住
activity跳转的时候,intent写法:
//写法一
var intent = Intent(this,YourActivity().javaClass)
//写法二
var intent = Intent(this,YourActivity::class.java)
//最后放到 startActivity()方法里面就行
startActivity(Intent(intent))
一个类中的变量想实现java中共的pulic static修饰效果,直接用类名可以调用
//在 var 修饰符前加 open就行
open var zodiacZodiacDataMap: MutableMap? = null
一个类中的方法想实现java中共的pulic static修饰效果,直接用类名可以调用
//在方法函数修饰符前加 open 并且放到 companion object {}中就行
companion object {
open fun shareMore(activity: Activity){
val textIntent = Intent(Intent.ACTION_SEND)
activity!!.startActivity(Intent.createChooser(textIntent, "Share"))
}
}
//调用时就可以直接用类名调用
SharerUtil.shareMore(this)
//在kotlin中创建一些容器
//int数组
var inArray= intArrayOf(20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22)
//字符串 数组
var strArray = arrayOf("ss", "ss", "ss", "ss", "ss")
//字符串 map
var myDataMap: MutableMap? = mutableMapOf()
//字符串list
var strList = listOf( "ss", "ss", "ss", "ss", "ss")