老司机带路——15个Android撸代码常见的坑

简介: 老司机为何能够成为老司机,不是因为开车开得多,而是撸多了… 0x00 使用 startActivityForResult 后在 onActivityResult 中没有正确回调到 Activity.

 

老司机为何能够成为老司机,不是因为开车开得多,而是撸多了…

0x00 使用 startActivityForResult 后在 onActivityResult 中没有正确回调到 Activity.RESULT_OK

1. 要正确获取到 RESULT_OK 的状态码,Activity 的启动模式不能为设置为的 singleTask 或者 singleInstance

2. 调用 startActivityForResult(intent,requestCode) 方法时第二个参数不应该使用过大的整数,例如超过 65535

0x01 Activity 的 onCreate() 方法中操作 View 相关

 

1. 不能直接获取 View的宽高,而应在 view.post() 里面操作

2. 不能调用 PopupWindowshow 方法显示,也应在 view.post() 里面操作

0x02 TransactionTooLargeException 异常

这个错误主要发生在 Intent 中传递了大量的数据。
例如有一个 Activity 页面跳转中,经常会使用 Intent 传递数据,但是稍不留神就会把一个很大的对象(列表, bitmap 等)传递过去,这时候就会出现这个异常。
建议不要在 Intent 中传递大数据,应该使用持久化的方式共享数据。而且数据过多也会影响 Activity 的启动速度。
类似问题 startActivity() 时发生以下错误

java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy。This log means that your app is having trouble handling a communication intent. Sometimes problems like this can be cause by sending an intent with big extras. Try to reduce the dimension of the image or, and this is the best way, save your image on the sd and put in the extras only the Uri of that image。
即不要在 Intent 中传递大量的数据数据,否则会抛异常。

 

 

0x03 FragmentTransaction.setCustomAnimations() 后动画没有效果

setCustomAnimations 要在 replace()add() 或 remove() 等对 Fragment 添加或者移除的方法前面。

0x04 应用使用多进程应该注意的问题

 

1. Application 会被初始化多次,即 onCreate() 方法会执行多次。在这里的一些初始化逻辑,例如数据库初始化,就需要根据判断当前进程的名称来进行初始化。

 2. 主进程与子进程数据共享的问题。由于不存在同一个内存空间,数据共享可以考虑使用 ContentProvider

0x05 应用打包后 H5 无法访问到 WebView 与 JS 交互的自定义 JSBridge 类

WebView 通过 addJavascriptInterface() 注入本地实现的方法类 JsBridge 供 H5 访问,但是打包时应该把自定义的 JSBridge 类加入到混淆规则里面,否则混淆后 H5 将有可能无法访问本地方法。

0x06 App 端使用 WebView.loadUrl() 执行 JS 方法后无响应

 

1. WebView 通过 loadUrl() 执行 JS 方法后却无响应,但是前端确定已提供。这时候应该考虑使用主线程(例如 WebView.post() )来执行 loadUrl()

 2. 通过 H5 调用本地方法时,如果 H5 是异步调用,那么也应该考虑把本地方法的实现放在主线程中。

0x07 UI 控件的样式出现了很奇诡的渲染,例如花屏、闪动等的问题

1. 有些机型使用硬件加速出现了一些奇诡的UI问题,可以检查一下控件所在 Activity 是否配置了硬件加速,多数情况下去掉硬件加速就 OK 了。
2. 如果需要硬件加速的配置,可以考虑在控件本身上使用,而不是 Activity 上。

0x08 Activity 与 Fragment 控件 ID 重复的问题

Activity 中使用 FragmentActivity 中有一个控件 ID 为 R.id.widget_btn ,但是在 Fragment 里面也有一个控件 ID 为 R.id.widget_btn ,那么在 Fragment 里面使用 getActivity().findViewById() 时就无法取到正确的控件引用。

0x09 WebView 无法弹起 H5 中的 alert 和 comfirm 对话框的问题

WebView 是一个承载体,各种内容的渲染需要使用 WebViewChromClient 去实现,所以需要设置一个默认的 WebChromeClient 实现。但是一般情况下实现自定义 WebView 都会重写 onAlertonConfirm 方法,使用 AlertDialog 来展示 H5 中的 alert 或者 confirm 对话框。

0x10 GridView 中的 Item 无法居中问题

查看一下 GridView 的布局文件是否设置了 android:scrollbarStyle="outsideInset" 属性,如果有,去掉这个属性。

0x11 EditText textCursorDrawable 属性直接用 color 在很多手机上光标是不会闪动

需要用 drawable 来设置这个属性,写一个 drawable 文件,例如
<shape xmlns:android="http://schemas.android.com/apk/res/android"                    android:shape="rectangle" >
 <solid android:color="@color/white" />
 <size android:width="1dp" />
</shape>

0x12 在 ListFragment 中 set footer 后 java.lang.IllegalStateException问题

不要 ListFragmentonCreateView() 中设置 footer ,要在 onActivityCreate() 中设置,否则会 Caused by: java.lang.IllegalStateException: Content view not yet created

0x13 开源项目 TabPageIndicator Tab 默认情况只显示 6 个中文字符,过多的字符被截断了

可修改 TabView 中的 mMaxTabWidth 的值,默认时 mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.4f); 修改为 mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 1f);

0x14 SpannableStringBuilder 修饰文本影响 ListView 性能问题

通常需要在一个列表中对 Item 的文本作一些特殊的修饰处理,例如对文本添加简单的图标,文本颜色,字体高亮等等效果,这时候 SpannableStringBuilder 就可以帮上忙了。但如果在 getView() 方法里构造 Spannable 对象,明显会影响列表的展示的效率,应该在线程中先这些 Spannable 数据构造好,而 getView() 尽量少做影响列表性能的操作。

 

微信关注我们,可以获取更多

 

目录
相关文章
|
30天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
24 1
|
1月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
29 2
|
3月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
41 3
|
3月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
102 2
|
4月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
【7月更文挑战第28天】在Android开发中,每位开发者都追求极致的用户体验。然而,“代码执行慢”的问题时常困扰着开发者。通过案例分析,我们可探索从新手到高手的成长路径。
40 3
|
3月前
|
Java Android开发
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
40 0
|
4月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
5月前
|
JavaScript 前端开发 Android开发
kotlin安卓在Jetpack Compose 框架下使用webview , 网页中的JavaScript代码如何与native交互
在Jetpack Compose中使用Kotlin创建Webview组件,设置JavaScript交互:`@Composable`函数`ComposableWebView`加载网页并启用JavaScript。通过`addJavascriptInterface`添加`WebAppInterface`类,允许JavaScript调用Android方法如播放音频。当页面加载完成时,执行`onWebViewReady`回调。
|
4月前
|
Web App开发 JavaScript 前端开发
Android端使用WebView注入一段js代码实现js调用android
Android端使用WebView注入一段js代码实现js调用android
119 0