首页 文章 精选 留言 我的

精选列表

搜索[android jetpack],共10000篇文章
优秀的个人博客,低调大师

Android常见Crash原因

1.Java Crash java代码导致jvm退出,弹出“程序已经崩溃”的对话框,最终用户点击关闭后进程退出。Logcat会在“AndroidRuntime”tag下输出Java的调用栈。 2.Native Crash No.&Name Reason Resolution Comment 1.空指针 试图对空指针进行操作时(如读取空指针指向的内存),处理器就会产生一个异常 在使用指针前加以判断,如果为空,则是不可访问的。 空指针目前是糯米app最多的一种引起crash的原因,但是它也很容易被发现和修复。 2.野指针 指向的是一个无效的地址,该地址如果是不可读不可写的,那么会马上Crash;如果访问的地址为可写,而且通过野指针修改了该处的内存,那么很有可能会等一段时间(其它的代码使用了该处的内存后)才发生Crash。 在指针变量定义时,一定要初始化,特别是在结构体或类中的成员指针变量。 在释放了指针指向的内存后,如该指针不再用应置为NULL 看代码很难查找,通过代码分析工具也很难找出,只有通过专业的内存检测工具,才能发现这类bug。 。 数组越界 访问无效的地址。如果该地址不可读写,则会马上Crash;如果修改了该处的内存,造成内存破坏,那么有可能会等一段时间才在别处发生Crash。 所有数组遍历的循环,都要加上越界判断。 用下标访问数组时,要判断是否越界。 通过代码分析工具可以发现绝大部分的数组越界问题。 破坏内存的bug,很难查找。 整数除以零 整数除以零默认的处理方式是终止进程 在做整数除法时,要判断被除数是否为0的情况。 改情况在开发环境下很难出现,但庞大的用户量和复杂的用户输入,就很容易导致被除数为0的情况出现。 格式化输出参数错误 与野指针类似,但是只会读取无效地址的内存,而不会造成内存破坏。其结果是要么打印出错乱的数据,要么访问了无读写权限的内存而立即宕机。 在书写输出格式和参数时,要做到参数个数和类型都要与输出格式一致 缓冲区溢出 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏函数调用的堆栈,修改函数调用的返回地址。如果不是黑客故意攻击,那么最终函数调用很可能会跳转到无法读写的内存区域,造成程序崩溃。 检查所有容易产生漏洞的库调用,比如sprintf,strcpy等,它们都没有检查输入参数的长度。 使用带有长度检查的库调用,如用snprintf来代替sprintf,或者自己在sprintf上封装一个带长度检查的函数。 内存管理错误 可用内存过低,app所需的内存超过设备的限制,app跑不起来导致App crash。 内存泄露,程序运行的时间越长,所占用的内存越大,最终用尽全部内存,导致整个系统崩溃。 imageview,图片占据太多内存,糯米app狂刷列表。

优秀的个人博客,低调大师

Android换肤方案分析

0x0 背景 无论是出于用户个性化的考虑,或者是不同场景下的氛围渲染,客户端应用存在着换肤的需求。本文举出三种常见的换肤方案,并加以对比,以作后续参考。无论何种方案,换肤的核心都包含皮肤的管理,皮肤的加载,以及皮肤的生效。不同的方案在解决这些问题上有不同的思路。 0x1 手动重新设置UI资源 这种方式最简单,在业务代码里面手动写设置新皮肤的逻辑,当新皮肤下发时,回调该逻辑重新设置UI资源,就达到了换肤的逻辑。这种方案思路简单,但是业务入侵的,需要手动写代码,有维护成本。而且由于需要手动写重新设置UI的逻辑,因此一般不会对所有的控件都更换UI资源,因此换肤的范围存在局限性。 public void onSkinChanged(JSONObject newSkin) { int newTextColor = newSkin.optIn

优秀的个人博客,低调大师

Android之初识Emoji

在开发中突然需要传Emoji,然而直接传的话会报错,而之前开发时又没接触够Emoji,所以打算好好研究一下。 1.Emoji的形式 我想先打印出来看看Emoji是怎么样的,我就设断,看看输入Emoji之后的字符串是怎样的,结果发生了十分有意思的事情。 在调试监听的时候显示的是豆腐块 但是编译器里面又能显示图 再试试在Log中打印,直接就不显示 做到这里,已经不禁让我怀疑人生,我发现我对String一无所知,瞬间真的有一种不知道要怎么弄的感觉。如果哪位大神知道,请告诉我为什么String显示Emoji时会这样,谢谢。 虽然我不知道Emoji在String中到底是怎么样的,但是我可以用charAt()方法去查看它的地址,发现charAt()后打印出这个(我用了另一个Emoji) 实在看不出,再试试charArray CN是中国图标的emoji 最后得到的结果是 看得出分割时一般会把一个表情分割成2个char,国旗分割成4个,还有一个的,也看不出什么。 这什么玩意,还是不知道,上网查了下,这个叫Unicode 编码,这就很有意思了,那我就去看看编码的一些基础的知识。 2.编码 我就算没认真学过,都知道有个编码叫utf-8,那它和Unicode 编码有什么关系呢。 1个字节为8位,就是说1个字节可以用8位二进制来表示。而8位二进制一共有256种情况,也就是2的8次方。 所以刚开始就出现了ASCII码,它用每个情况表示一个符号,ASCII 码一共定义了 128 个字符。 但是想想,世界上这么多种符号,仅仅英文的话ASCII 码是能解决,但是汉字都不止256种了,所以产生了Unicode 编码,它就相当是ASCII 的一个扩展,但是,有会出现了一些问题,所以出现了UTF-8编码(我这只是简单的说)就当是规范了Unicode 编码。 所以Emoji得到的是Unicode编码,那么我就猜测一下为什么在AS中有时出现乱码,有时出现图案,因为在debug中在编辑器里面的是展示Unicode码的,所以能正常显示图片,而Logcat中的编码方式是utf-8,所以显示乱码。 不管怎么样,关键是这个Edittext.toString()得到的String是不是有Emoji的啊 既然打印和打断点不行,那我就只能画点时间搞个Demo了。 我做两个Edittext和一个Button,点击按钮时从第一个Edit获取String然后显示到第二个Edit 从结果可以看出,String里面是有包含Emoji的只是不能正常打印出来而已。 3.上传到服务器 既然能保证String含有Emoji,那么下一步就是怎么上传到服务器,直接把这个String上传到服务器是会报错的。 (1)转成Base64 先把字符串转成Base64再上传,这是我在网上看到的一篇文章,先测试下转码后再解码能不能得到之前的形式。 btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String str = edtUp.getText().toString(); // 转码 String str_count= Base64.encodeToString(str.getBytes(),Base64.DEFAULT); // 解码 String str2 = new String(Base64.decode(str_count.getBytes(), Base64.DEFAULT)); edtDown.setText(str2); } }); 可以看出可以使用Base64转码和解码是能成功得到Emoji的。转之后就是一个字符串,数据是能保存的,那接下来我就试试能不能把Emoji上传到数据库然后在返回正常显示。 测试中......测试内容保密...... 最后得到结果并展示到textview 可以看出这样的做成是可以的,就不用再写什么先转换再拼接了。 4.屏蔽 直接上传emoji会出错,据说是因为 那这样的话,解决这个的问题其实还是数据库去改进,但是......你觉得你说一句“这个是后台的问题,你们来改”,后台人员就会改吗?他只会说“你们前端先想办法解决一下。”没错,受欺负的永远是前端,那怎么办,那我们只好想办法屏蔽咯。 (1)网上有很多判断的方法,但是我真的不敢用,有些评论说某些不完整,搞得我都不知道哪些是能用的,哪些是判断不完整的。 但是我又找不到其它解决的办法,总觉得屏蔽真麻烦,最直接的办法还是后台给改了,但是人家肯定不愿意弄,那我就贴上代码(真的很担心这个判断会不会又漏) /** * 屏蔽emoji */ public static String deleteEmoji(String str){ StringBuffer sb = new StringBuffer(); char[] charArray = str.toCharArray(); for (int i = 0; i < charArray.length; i++) { if (!isEmojiCharacter(charArray[i])) { sb.append(charArray[i]); } } return sb.toString(); } /** * todo 这是网上找的判断区间,不知道完不完整,暂时先用 * @param codePoint * @return */ private static boolean isEmojiCharacter(char codePoint) { return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD) || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF))); } 这样操作就能得到屏蔽表情的字符串。 5.总结 关于emoji我是第一次尝试,这回主要做的任务是怎么将emoji传到后台并正常获取显示。表面上我是实现这个功能了,为什么说是表面上呢,因为我传的是Base64,如果真要这么做的话,必须和所有端都统一,不然你传Base64,其它端不解码展示Base64那就很麻烦。 我想真正寻求的最优解是我这传的是字符串,别的机子要是能正常显示就显示,不能正常显示就隐藏,但是发现目前我还真不知道要怎么弄,直接传的String后台是无法接收的,好像是因为数据库是3位而emoji大部分都是4位。 还有一点就是自己写一个Emoji页面来展示这个没做,现在用的Emoji是输入法提供的,但是有些APP会有自己弄的Emoji页面,这个之后再说吧,总之这次最大的收获就是基本认识了Emoji,有种一层迷雾散开的感觉,虽然并没解决最根本的需求问题,但也不亏。 补充 1.开源框架 之后我又发现一个开源的emoji操作的框架https://github.com/vdurmont/emoji-java 这个框架的API还是挺好了解的,就是那个判断字符串中是否包含emoji的判断没用,但是可以用获取emoji数据取长度来判断 List<String> emojis = EmojiParser.extractEmojis(str); if (emojis.size() > 0) { ...... } 2.使用屏蔽的场景 上面我已经讲了在数据库不支持的情况怎么上传emoji,现在我打算补充下屏蔽emoji的使用场景。 (1)比如输入名称/标题等等这些场景如果输入emoji的话,就好就是提示用户无法输入特殊符号(仿美团的做法) (2)比如评论,回复这些长的内容输入emoji而要屏蔽的话,可以在上传时候删除掉其中的emoji,用我发的框架的做法就是 EmojiParser.removeAllEmojis(str)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册