Android开发常见异常和解决方案(二)

异常一: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")

你可能感兴趣的:(android,kotlin,Android,Bug)