Android易错点汇总
- 格式:docx
- 大小:69.70 KB
- 文档页数:2
Android开发常见问题解决方案随着移动互联网的快速发展,安卓市场的崛起不可阻挡,越来越多的开发者开始投身于安卓开发行业。
然而,尽管安卓开发领域有着巨大的商业价值,但各种程序问题也使安卓应用程序的开发过程变得举步维艰。
为此,这篇文章将结合我多年的安卓开发经验,为大家总结一些安卓程序开发中常见的问题及其解决方案。
一、内存溢出安卓应用程序在运行过程中如果占用的内存过多,就会出现内存溢出的情况,导致程序无法正常运行甚至直接崩溃。
为了解决这个问题,我们可以采用以下几个方法:1.及时回收无用的对象,防止内存泄漏,可使用虚拟机提供的GC(Garbage Collector)机制。
2. 使用缓存技术,对一些频繁访问的数据进行缓存,减少内存的占用。
3. 通过管理器来确保内存的被妥善释放,不再占用内存。
二、ANR(应用程序无响应)安卓开发中,当程序处理一些耗时操作时,就可能会导致ANR(Application Not Responding)现象出现。
此时,程序会停滞无动,用户无法正常使用。
为了避免ANR问题,我们可以采取以下几个措施:1. 在UI线程外执行耗时操作,如搜索网络、磁盘IO、图片加载等操作,可以通过启动一个新的线程或使用AsyncTask等异步任务处理机制来实现。
2. 使用Handler等机制通过消息机制实现非UI线程与主线程的交互,做到程序的快速响应。
3. 在开发阶段,使用DDMS中的traceview工具对应用程序进行评估和优化,及时找出导致ANR的问题点。
三、UI界面卡顿安卓应用程序在运行过程中,当UI界面过于复杂或处理大量数据时,会导致UI卡顿甚至崩溃的现象。
下面介绍一些解决方案:1. 通过异步任务等线程切换机制,将耗时操作放入子线程进行,保证UI 线程的干净与流畅。
2. 对于绘制复杂的UI元素,如ListView、GridView等,可以使用ViewHolder、异步框架等技术实现懒加载,单次绘制的数量不超过15个View。
Android运行常见错误
单元测试:
Warning: No instrumentation runner found for the launch, using android.test.InstrumentationTestRunner
模拟器不能记住Androidmanifest的配置,在运行时需要重新设置运行配置,如下:
1.在工程名字上点击右键,选择properties
2.在Run/Debug setting列表中删除全部配置,这些配置在每次单击“Android JUnit Test”运行后会自已生成的。
3.重新运行该测试单元,则就不会出现上面的警告了。
将数据库导出时报错
Failed to pull selection null
1.路径中可能有中文,将中文名全部改为英文名
2.重启模拟器或者eclipse
导入数据库时
Failed to push items null
重启Eclipse
Android开发用真机连接Eclipse时,打不开File Explorer下的data文件夹
第一步:获取ROOT权限
Root权限指的是让某些软件具备修改手机上一些文件夹读取的权限
获取方式:360Root、百度Root等
第二步:在手机上下载Root Explorer或相关的软件,将data的权限修改为可读、可写、可执行。
c.getString(c.getColumnIndex(“字段名”))
返回值是-1,即没有找到这个字段,一般是字段名写错了。
黑马程序员:Android Studio 多渠道打包以及常见错误在多渠道打包方面可以说Google真的是业界良心. studio支持多渠道打包啦.而且打包还算是效率比较高的.深吸一口气,开始吧!第一步:在build.gradle(Modle:app)下配置要发布的渠道名称.android {compileSdkVersion 23buildToolsVersion '23.0.1'defaultConfig {applicationId "com.example.retrifitdemo"minSdkVersion 18targetSdkVersion 23versionCode 1versionName "1.0"}productFlavors {wandoujia {}youmeng {}}productFlavors.all {flavor ->flavor.manifestPlaceholders =[Pack_CHANNEL: name]}...}其实在Project Structure中也可以配置渠道名注意:渠道名不要以数字开头,尽量不要写java关键字productFlavors,productFlavors.all 不要写错位置,要写在android {}内部.否则会报下面的错误第二步:使用Build开始打包选择已有签名输入密码点击next.如果没有签名点击create new…开始傻瓜式创建创签名文件.这个时候Flavor框中会有刚刚配置的渠道名,想打什么渠道的直接选择就行了.静静等待就行了完成后会发现app>>>outputs>>>apk下会有打包好的apk慢些开车!有人会说: 哥们不对啊! 还没在AndroidManifext.xml 文件中配置meta-data值吧!这个meta-data确实是需要配置的.只是这个值如果单纯的和打包扯关系的话, 可以认为没有关系.这个设置是我们集成友盟,Bugly…时去收集到到底是哪个渠道的apk 出现的一些信息或问题.简单来说如果没有配置的话,也是没问题的.不过一般我们的应用都会去配置的.。
安卓系统开发的常见问题与解决方案梳理安卓系统开发是目前热门的技术领域,不少程序员都想要探究其中的奥秘。
然而在开发过程中,总会遇到各种各样的问题,如:应用启动慢,内存泄漏,OOM(Out Of Memory),ANR (Application Not Responding),热修复等。
这些问题都给安卓开发者带来了不少困扰,下面针对这些常见问题,为大家提供一些解决方案。
1. 应用启动慢应用启动慢是安卓系统开发中常见的问题,尤其是在应用内部需要大量初始化操作的情况下。
针对这种情况,开发者可以采用延迟初始化的方式,即在应用启动后通过异步线程进行初始化,从而提高应用启动速度。
此外,还可以通过减少应用的启动流程,缩短冷启动时间,提高用户体验。
2. 内存泄漏内存泄漏是安卓开发者面临的另一个大问题,它会导致应用崩溃或者占用过多的内存,从而影响应用的性能和稳定性。
针对这种情况,开发者可以通过使用Android Studio提供的Profiler工具来查找内存泄漏。
另外,还可以通过及时释放资源、避免对象引用循环等方式来避免内存泄漏。
3. OOM(Out Of Memory)OOM指的是内存不足,是安卓开发者常常面对的问题。
当应用占用的内存超过了系统规定的阈值时,就会出现OOM问题。
为了避免OOM,可以采用如下解决方案:- 及时释放无用资源或变量- 使用弱引用- 限制图片的大小和数量- 通过调整内存大小等方式优化应用性能4. ANR(Application Not Responding)ANR是指应用无响应,在应用响应超过五秒钟时,就会发出ANR警告。
这种情况通常是因为应用在主线程执行了耗时操作,从而导致主线程被阻塞。
为了避免ANR,可以采用如下解决方案:- 减少主线程的工作量- 使用异步线程处理耗时操作- 使用Handler、Message、AsyncTask等机制避免主线程被阻塞5. 热修复热修复是指在应用运行期间,针对线上应用中的某些错误,通过修复行动来快速修复,从而避免应用的重发版本。
Android开发中常见的注意点总结⼀下Android开发中常见的注意点。
资源不允许出现 Receiver/AppOps/Cursor/Observer 资源泄露使⽤ HandlerThread 要注意退出,否则导致 Thread 和 FD 泄露不允许出现 global/local references 的 leak 问题不要多线程调⽤通过 Binder 返回内容很⼤的系统接⼝不要通过 Binder 传递超过 100K 以上的数据尽量少注册⾼频回调监听器A NR耗时操作不要在 UI Thread 执⾏,防⽌ ANR 问题发⽣应⽤进程间通信不要使⽤ broadcast 机制,避免 ANR不要在 BroadcastReceiver 中 onReceive 函数启动 Thread 进⾏异步操作不要在 onCreate 主线程启动的时候使⽤ Provider 数据库尽量不要使⽤静态⼴播⽅式接收系统频繁发送的⼴播C r as h针对⽆法保证部位 Null 的变量要进⾏⾮空判断⾮ UI 线程不允许进⾏ UI 更新不允许通过捕获 RuntimeException 类异常规避问题App 不要使⽤ setDefaultUncaughtExceptionHandler ⽅法注册私有异常处理函数⾮ Thread Safe 的 list 并发场景下,遍历引发异常Parcel.marshal 不允许含有 binder objectparcel.recycle 不允许重复调⽤多次并发正确使⽤对象的 wait / notify 同步函数,避免出现死锁等问题不能使⽤ double check lock patternAndroid 应⽤进程禁⽌通过 Fork 创建⼦线程System_Server 进程中尽量不要启动新的 ThreadSystem_Server 进程中所有 UI 操作要在 UI Thread 上完成。
Android8.0中⼀些坑以及对应的解决⽅法前⾔虽然 Android 9.0 都已经⾯世了,本篇⽂章写的有点迟了。
但是迟到好过不到,因此基于此这边还是记录⼀下项⽬中遇到的 Android 8.0 的坑及对应解决⽅法。
每次系统升级,虽然系统功能更加强⼤了,各⽅⾯性能也提⾼了。
但是对于开发者⽽⾔,⼀个困扰的问题也是随之⽽来——兼容。
尤其对于⼀些已经上市的 App ⽽⾔,在新系统发布之前就要了解到底有哪些改动,以避免⽤户升级新系统后导致 App 没法正常运⾏。
好了,回归主题,说说 Android 8.0 ⾥⾯的⼏个坑吧。
唤不起系统安装器如果你的 App 提供了更新功能,⽤户点击更新,你下载完 Apk 之后会⾃动弹出安装界⾯。
这个安装界⾯的弹出就是依赖于系统的安装器。
假设你在 Android 8.0 以下的⼿机操作正常,但是在 8.0 的⼿机上,你会发现,下载完之后完全没反应。
这个时候假设你以为说弹个提⽰让⽤户⾃⼰安装,我想说⽤户才不会理你。
⽤户分分钟就不更新了。
所以说我们要解决这个问题。
让这个安装器在 Android 8.0 的⼿机也能正常唤起。
其实解决⽅法⾮常简单。
只需要在 AndroidManifest.xml 中声明以下权限即可。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />⽽且还不需要你在代码动态申请,是不是 So easy。
⼀⾏代码解决这个兼容性问题。
通知问题假设你的 App 需要在任务栏显⽰通知。
如果你是按照 Android 8.0 之前的写法的话。
那么在 8.0 的⼿机上⾯你是显⽰不了的。
那怎么办呢?关于通知的基本写法这边就不再赘余,如果不清楚的⼩伙伴⾃⾏查阅资料。
这边重点说下解决⽅法。
⾸先说下下⾯代码出现的⼏个变量:private static NotificationManager manager;public static final String NOTIFICATION_CHANNEL = "your app pkg name";private static final String NOTIFICATION_CHANNEL_NAME = "App Channel";第⼀个写过通知的都知道,⼀个管理类。
app不易发现的小bug
1.翻页
手机客户端,内容超过一页时,上拉加载更多内容,加载错误(容易出现数据重复,图片和文章不匹配,图片重复加载,文章标题和内容不一致等情况)。
2.刷新
下拉刷新时,页面加载错误,错误同上(补充,刷新失败,无法加载到数据。
3.登录
新旧账号登录错误,错误调用方软件。
4.内存不足时,无法退出APP
多个软件同时打开,切换软件时,会导致多次点击退出回到首页,无法退出APP。
5.手机拍照崩溃问题
带手机拍照软件,拍照时手机崩溃(星问题偏多,且会出现照片倒置90度问题)。
6.手机适配问题
不同的分辨率适配问题(市面上安卓的分辨率非常多,随便百度一下就有了)。
7.上拉加载过程中,后台添加一条文章,出现重复显示第一页最后一篇文章(一般弱网络下容易出现)。
8.数据加载不到,出现崩溃
后台添加一些特殊字符,如颜文字,英文标点字符等,客户端显示错误。
使用过去Android 1.1或1.5版SDK开发的项目导入到使用新版ADT插件的1.6或2.0.1项目中可能会发现报错,其实谷歌给我们提供了一个工具可以解决这个问题,在Package Explorer中选择项目,单击鼠标右键在弹出的下拉菜单中选择 Android Tools - Fix Project Properties即可发现一些文件解决了,同时新版本的ADT插件需要注意API LevelgetIntentSender错误解决方法在Android编码中会出现getIntentSender这样的方法不能用,或提示安全不允许,其实后面描述已经很清晰了,is not allowed to send as package android,getIntentSender这样的方法不允许从包中使用,通过一个服务调用即可。
虽然Android平台提供了很多 permission的限制,但是最终很多还是不给第三方开发者公开的。
目前来说Google必需的强制签名似乎还没有起到很大的作用,仅仅是安装时提示有哪些危险操作,未来可能需要一些更严格的检测。
does not declare uses-library android.test.runner在平时Android开发时突然执行程序,出现了Application does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner的错误提示,这主要是你再Run As中错误的选择了目标为Android JUnit Test这项导致的,解决的方法也很简单在Run Dialog中删除JUnit Test这条即可。
Android导入一个工程时提示 Invalid project description字样,当我们单击<<Details按钮查看详细内容可以看到overlaps the location of another project,其实这是基于Eclipse IDE导入工程时遇到描述文件版本不对都会存在这种问题,而这个问题在Android开发中其实是由于androidmanifest.xml 文件版本不同造成的很多Android开发人员都有一个感受就是通过Eclipse配合Android ADT插件开发经常遇到DDMS失去和模拟器的连接,整体感据感觉很不稳定,有时甚至Logcat无法捕获到调试信息,其实这都是因为Eclipse构建于Java平台造成的,其实这类问题同样困扰着Symbian的Carbide. C++它也同样使用了开源工程Eclipse,JRE的稳定性当然不能和微软纯Native C++的Visual Studio相提并论稳定性,但是Android开发网总结出来的临时解决方法就是使用“进程管理工具结束掉adb.exe进程,重新启动Eclipse 才能保证Logcat正常捕获信息”。
【Android培训】Android 零散知识点整理为什么Android的更新试图操作必须在主线程中进行?这是因为Android培训中的视图组件并不是线程安全的。
通常应该让主线程负责创建、显示和更新UI,启动子线程,停止子线程。
让子线程完成计算并向主线程发出更新UI的消息,让主线程来更新UI。
这就促使Android中产生了Handler机制。
如何更改Android Studio编译所采用的API版本?通过module setting 的Flavors选项卡进行Android API编译版本的更改;小米手机更改应用程序图标后,桌面上图标没有什么变化?重启后可解决问题;EditText的光标为何不显示?首先设置cursorVisible属性为true,然后设置textCursorDrawable(背景色与控件背景色不要一样),textCursorDrawable属性是在API11才推出的属性;ListView的android:listSelector属性如何使用?a、解决为什么无效;b、找到替代方法:首先,在自己实现的Adapter的getView()方法中进行如设置:if (position == selectItem) { convertView.setBackgroundColor(Color.RED); } else { convertView.setBackgroundColor(Color.TRANSPARENT); } 然后,在onItemClick()方法中,进行如下设置:adapter.setSelectedItem(position) adapter.notifyDatasetInvalidated();b、如何对TextView的部分文字进行特定样式设置?要对TextView的部分文字进行样式设置,需要用到SpannableStringBuilder类,该类提供了setSpan(Object what, int start, intend,int flags) 方法,其中的what可以为以下类的实例:URLSpan;ClickableSpan;BackgroundColorSpan;ForegroundColorSpan;MaskFilterSpan;AbsoluteSizeSpan;RelativeSizeSpan;ImageSpan;ScaleXSpan;StyleSpan;SubscriptSpan;SuperscriptSpan;TextAppearanceSpan;TypefaceSpan;RasterizerSpan;StrikethroughSpan;UnderlineSpan;使用方法:a、得到SpannableStringBuilder类的实例:builder;b、得到Span子类的实例,如ForegroundColorSpan的实例forgroundColorSpan;c、调用setSpan方法,指定要进行样式修饰的起始位置,进行参数填充;d、调用TextView的setText(SpannableStringBuilder builder)方法;mac版eclipse导入Android项目里面的中文乱码问题如何解决?1、在Preference中找到Text File Encoding,选择Other,手动输入GBK即可2、选择乱码的文件,右键选择属性,在Text File Encoding中进行修改(这是针对单个文件的修改方法),针对所有的*.java文件,可采用在Eclipse的偏好设置中的General->Content Type->Text->JavaSource Files->Default Encoding中进行设置。
Android易错点汇总
对于Android程序员来说平时开发Android应用很多地方需要我们注意,下面是Android123通过浏览大部分源码易错的地方。
一、数据库的Cursor
对于Android SQLite数据库封装的查询返回对象Cursor来说比较容易出错的有
1. Cursor返回可能为null。
如果query返回的Cursor对象为空,执行cursor的任何方法肯定有空指针异常了,这点Android的代码有40%都没有注意到。
2. Cursor返回为0。
我们仅仅判断不为空还不行,如果Cursor的对象为0,执行了moveToFirst(); 这样的方法就比较尴尬了,这点Android开发网格外提示大家注意。
3. 遍历Cursor时没有执行moveToFirst(),这样游标的位置就不确定了。
4. Cursor使用完后要手动关闭,cursor.close()这个方法不要忘记了。
5. Cursor的类型获取,比如说getInt和getLong,由于在SQLite 中boolean和long型均为SQLite的Integer所以,读取时一定记住转换。
二、新建的service、activity没有在androidmanifest.xml中注册,对于activity还好说,如果是service同时service使用的package name和主程序的package name有出入还记得手动写上相对的包名
三、Parcelable使用时内部类的异常处理,比如内部存储Bitmap 对象时,如果Bitmap对象为空就会出现问题了。
(ps:本文章由北大青鸟广安门校区搜集自互联网)。