先说经常碰到的问题,经常碰到的问题无非就是空指针,角标越界等几种异常,比如:
1.NullPointerException 空指针异常
2.ClassCastException 数据类型转换异常(查看数据类型是否转换正确)
3.ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException 数组下标越界异常
4.ActivityNotFoundException 找不到activity(去AndroidManifest.xml添加activity注册)
5..NumberFormatException 数字格式化异常(不用说了吧,数字类型)
6.SQLException 操作数据库异常类
7.OutOfMemoryError 内存溢出(这种情况虽然经常说,但是在实际开发中会去避免触发这种错误,这个不属于异常,属于error)
8.IllegalArgumentException
9.NoSuchFieldError Java反射中的一个异常(表示无法通过反射找到需要的字段,加上指定资源即可)
10.android.view.WindowManager$BadTokenException (异常出现原因是由于将要弹出的dialog所要依附的View或activity已经不存在导致的)
11.TransactionTooLargeException Intent传递数据过大异常,部分机型出现。
以上属于异常或者错误,还有一些界面和操作的问题,比如:
问题一.最常见的滑动冲突,刷新框架嵌套ScrollView嵌套RecycleView,滑动冲突了怎么办?
答:这种问题说起来也好解决,View的相关事件只有两个:dispatchTouchEvent、onTouchEvent。首先要理解事件的分发机制,要知道滑动的事件被哪一层View捕捉了。当一个Touch事件(触摸事件为例)到达根节点,即Acitivty的ViewGroup时,它会依次下发,下发的过程是调用子View(ViewGroup)的dispatchTouchEvent方法实现的。简单来说,就是ViewGroup遍历它包含着的子View,调用每个View的dispatchTouchEvent方法,而当子View为ViewGroup时,又会通过调用ViwGroup的dispatchTouchEvent方法继续调用其内部的View的dispatchTouchEvent方法。dispatchTouchEvent方法只负责事件的分发,它拥有boolean类型的返回值,当返回为true时,后面的子View将都接收不到本次Touch事件。所以根据冲突的情况去分析问题。
问题二:机型适配,市面上各种机型都有,什么刘海屏,极点屏,水滴屏等等,有的屏幕还带圆角,如果设置了全屏无title的界面,难免会遮住UI,遇到这种手机怎么适配?
答:首先可以确定以上屏幕的手机都是18年以后发布的,Android版本基本上都是7.0以上,所以解决方式也更简单,我想的一种方法是全屏获取状态栏的高度然后动态设置View的高度即可,在网上找了一个框架也很符合我的想法,叫NotchFit。有时间的童鞋可以看看。
问题三:Android版本适配问题
答:Android版本的特性是每个Android开发人员必须要了解的事情,Android 5.0开始使用MD设置风格,通知详情可以用户自己设计。Android6.0危险权限必须动态申请,取消了Apache HTTP客户端,增加activity的转场动画。Android7.0多窗口支持,访问私有目录时需要配置FileProvider,增加签名V2,删除了三项隐式广播(CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO),优化内存使用和电量消耗。Android8.0对隐式广播、后台服务和位置更新等进行了后台自动限制、隐私性、权限,如果小米华为oppo手机需要接收推送消息需要在平台中加入渠道配置。Android9.0 MD风格优化,通知栏优化,推送更加严谨。以上内容为开发人员需要知道的基本信息,具体信息可以在网上搜索。
课外知识:
5.0推出的ART虚拟机,在5.0之前都是Dalvik。他们的区别是:
Dalvik,每次运行,字节码都需要通过即时编译器转换成机器码(JIT)。
ART,第一次安装应用的时候,字节码就会预先编译成机器码(AOT)。
小米手机有个悬浮窗权限(7.0以上手机有),这个权限需要动态去申请,但是只能提示用户,然后跳转页面让用户手动打开,如果不申请,很多悬浮窗口都无法弹出显示,如Toast。
问题三:访问手机相机或手机相册时崩溃,崩溃信息提示android.os.FileUriExposedException怎么办?
答:这个问题出现在Android7.0以上手机,问题原因为没有在AndroidManifest.xml注册FileProvider。有的人问为什么要配置这个,别问为什么因为这是7.0手机的新特性,访问私有目录增加的限制。所以要判断手机版本是否大于7.0,如果大于那么Uri的 获取方式就需要通过FileProvider.getUriForFile(mContext,authority,new File(apkFilePath))获取。FileProvider是ContentProvider的一个子类,我们都知道ContentProvider扮演着数据共享的角色,而FileProvider就是帮助我们将限制访问的 file:// URI 转化为授权共享的content:// URI。这个问题网上一搜全是。
问题四:webView加载第三方网页点击弹不出下拉框
答:初始化webView传递的Context是Application中的Context导致的,解决办法修改如下:
WebView mWebView = new WebView(this);
问题五:JavascriptInterface标识的方法是不是异步的?
答:。。。
问题六:使用SpannableStringBuilder,在设置span时内存泄露。代码如下:
设置部分文本点击答:在 KitKat 之前,TextView 会复制 span 并onSaveInstanceState()使用 SpannableString将其放置在 Bundle 中。由于某种原因,SpannableString 不会删除 NoCopySpans,因此保存的状态包含对原始 TextView 的引用。可以覆盖 TextView.onSaveInstanceState(),然后使用反射访问 TextView.SavedState.mText 并清除 NoCopySpan 跨度。
问题七:
持续更新...
网友评论