首页
工具
隐私协议
App Privacy Policy
更多
作品
关于我们
Search
1
android5遇到INSTALL_FAILED_DEXOPT 解决办法
1,664 阅读
2
设置max_connections无效
1,484 阅读
3
FlexboxLayout+recyclerView实现自动换行
1,374 阅读
4
Nginx配置多个域名
1,257 阅读
5
Android P http网络请求失败
1,230 阅读
默认分类
mysql
android
android深入
Jetpack Compose
Android传感器
php
Yii2
windows
webrtc
登录
Search
标签搜索
android
kotlin
webrtc
kurento
mysql
adb
nginx
flutter
rsa
微信
git
Yii2
md5
加密
dart
aes
wechat
windows
小程序
dexopt
Typecho
累计撰写
80
篇文章
累计收到
3
条评论
首页
栏目
默认分类
mysql
android
android深入
Jetpack Compose
Android传感器
php
Yii2
windows
webrtc
页面
工具
隐私协议
App Privacy Policy
作品
关于我们
搜索到
52
篇与
android
的结果
2020-04-21
Handler是如何传递消息的
先认识下跟Handler有关的几个类:MessageQueue,Message,Runnable,Looper。Runnable和Message可以被传入某个MessageQueue中;Looper不断地从MessageQueue中取出Object然后传给Handler进行处理,依次循环,如果队列为空,就会进入休眠;Handler利用自身的处理机制对传入的Object进行相应的处理。认识这几个类后,再了解下Handler和Thread的关系一个Thread对应一个Looper;一个Looper对应一个MessageQueue;一个MessageQueue对应N个Message;一个Message中对应一个Handle来处理事件;由此可以看出,Thread和Handler是一对多的关系;而Handler主要有两个功能,处理message和将message传入MessageQueue中。Looper从MessageQueue中取出一个Message后,首先会调用Handler.dispatchMessage进行消息分发,默认情况下Handler的分发流程是:Message.callback(Runnable obj) 如果不为空会优先调用callback处理Handler.mCallback 如果不为空会调用mCallback.handleMessage如果以上两个对象都不存在,则会调用Handler.handleMessage如果项目中有需要改变handler的默认行为,可以重载dispatchMessage或handleMessage。Handler发送消息有两种方式,分别是post和send,这两种方式都是负责将message传入MessageQueue,区别在于send处理的参数直接是message,而post需要先把其它信息转换成message,再调用send来执行下一步,看源码:public final boolean post(Runnable r){ return sendMessageDelayed(getPostMessage(r),0); }因为调用时会传一个Runnable对象,post需要先将其封装成一个Message,接着通过对应的send把它传到MessageQueue里。private static Message getPostMessage(Runnable r){ Message m=Message.obtain();//Android系统会维护一个全局的Message池,当用户需要使用Message时,可以调和obtain获得,不用去自行创建,这样可以避免不必要的资源浪费 m.callback=r;//将Runnable对象设置为Message的回调函数 return m; }拿到Message后,再调用sendMessageDelayed来发送消息,这个函数可设置多长时间后再发送,在其内部又调用sendMessageAtTime来发送。public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue; if (queue == null) { RuntimeException e = new RuntimeException(this + " sendMessageAtTime() called with no mQueue"); Log.w("Looper", e.getMessage(), e); return false } msg.target = this; return enqueueMessage(queue,msg,uptimeMillis);//将message传入MessageQueue }这样就将一条由Runnable组成的Message通过Handler成功传入MessageQueue。
2020年04月21日
275 阅读
0 评论
0 点赞
2020-04-10
Android P http网络请求失败
最近更新了android studio,以及到gradle和android sdk版本 ;手机Pixel 2 xl,系统Android P;网络请求okhttp3,每次网络请求总是:java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy官网文档:Android致力于保护用户,他们的设备和数据安全。我们保证数据安全的方法之一是保护所有进入或离开Android设备的数据在传输中使用传输层安全性(TLS)。正如我们在Android P开发人员预览中所宣布的那样,我们通过阻止针对Android P的应用程序默认允许未加密的连接来进一步改进这些保护。这是我们多年来为更好地保护Android用户而做出的各种更改。为了防止意外的未加密连接,我们android:usesCleartextTraffic在Android Marshmallow中引入了manifest属性。在Android Nougat中,我们通过创建Network Security Config功能扩展了该属性,该功能允许应用程序指示他们不打算在没有加密的情况下发送网络流量。在Android Nougat和Oreo中,我们仍然允许明文连接。看来以后都要用https了,在Android P系统的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。目前找到的解决办法:1:改用https2:targetSdkVersion改为27以下3:在res的xml目录下,新建一个xml文件(名称自定义,如:network_security_config.xml),内容如下:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config><application ... android:networkSecurityConfig="@xml/network_security_config" ... />更多参考:https://android-developers.googleblog.com/2018/04/protecting-users-with-tls-by-default-in.html原文:https://www.jianshu.com/p/fb7374b544aa
2020年04月10日
1,230 阅读
0 评论
0 点赞
1
...
5
6