Android 11 系统上 Okhttp 3.10 版本上部分手机出现 Java .lang.VerifyError:Superclass okhttp3.internal.http1.Http1Codec$AbstractSource
Caused by:
5 java.lang.VerifyError:Superclass okhttp3.internal.http1.Http1Codec$AbstractSource of okhttp3.internal.http1.Http1Codec$UnknownLengthSource is declared final (declaration of ‘okhttp3.internal.http1.Http1Codec$UnknownLengthSource’
appears in /data/app/~~7Slsz0eTU_atlqLyl7NGKQ==/com.zhenhui.huilianyi-5gJPwjBAIcieNSC9WYPr4g==/base.apk)
6 okhttp3.internal.http1.Http1Codec.f(Http1Codec.java:259)
7 okhttp3.internal.http1.Http1Codec.a(Http1Codec.java:153)
8 okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:124)
9 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:147)
10 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:121)
11 com.huilianyi.hlybaselibrary.http.HttpClientManager$1.intercept(HttpClientManager.java:39)
12 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:147)
13 okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
14 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:147)
15 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:121)
16 okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
17 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:147)
18 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:121)
19 okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
20 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:147)
21 okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
22 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:147)
23 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:121)
24 com.huilianyi.hlybaselibrary.http.intercept.HttpInterceptor.intercept(HttpInterceptor.java:63)
25 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:147)
26 okhttp3.internal.http.RealInterceptorChain.a(RealInterceptorChain.java:121)
27 okhttp3.RealCall.i(RealCall.java:200)
28 okhttp3.RealCall.b(RealCall.java:77)
29 retrofit2.OkHttpCall.execute(OkHttpCall.java:180)
30 retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
31 rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80)
32 rx.Subscriber.setProducer(Subscriber.java:209)
33 rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76)
34 rx.Subscriber.setProducer(Subscriber.java:205)
35 retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
36 retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
37 rx.internal.operators.OnSubscribeLift.a(OnSubscribeLift.java:50)
38 rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
39 rx.Observable.a(Observable.java:8666)
40 rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
41 rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:220)
42 rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
43 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
44 java.util.concurrent.FutureTask.run(FutureTask.java:266)
45 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
46 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
47 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
48 java.lang.Thread.run(Thread.java:923)
2 条回复 • 2021-01-08 16:14:07 +08:00
|
|
1
chenjiajia9411 93 天前
混淆有问题,AbstractSource 给弄成 final 了,把 allowaccessmodification 关了,以后上传的日志*好也带上符号表或者直接还原不然不方便看。
还有如果还需要兼容 API 21 以下就把 OkHttp 升级到 3.12.12 ,不需要兼容的话直接升级到 4.9.0 吧。
|
|
|
2
haydenjie 92 天前
我看了一下这个 allowaccessmodification 这个配置工程里面没有,但是在 build 里面生成的配置文件里面找了这个,这个配置好像只会把 private 变成 public 。 现在是 bugly 上统计到部分 Android11 的手机出现,我找相同的手机却不能出现这个报错。
|
云原生这个词其实由来已久,IT行业永远也不缺乏新概念。2015 年,Pivotal公司的Matt Stine提出Cloud Native这一概念,并结合这个概念包装了自己的新产品Pivotal Web Service和Spring Cloud。在Matt Stine所著的Migrating to Cloud Native Application Architectures一书中,他对云原生的概念进行了详细的阐述。该书的中文版《迁移到云原生应用架构》已经在GitHub 上开源,感兴趣的读者可浏览或下载。
什么是云原生
云原生准确来说是一种文化,更是一种潮流,它是云计算的一个必然导向。意义在于让云成为云化战略成功的基石,而不是障碍。
自从云的概念开始普及,许多公司都部署了实施云化的策略,纷纷搭建起云平台,希望完成传统应用到云端的迁移。但是这个过程中会遇到一些技术难题,上云以后,效率并没有变得奇高,故障也没有迅速定位。
为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题,云原生这一概念横空出世。云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司的决策。
另外,云原生也很好地解释了云上运行的应用应该具备什么样的架构特性——敏捷性、可扩展性、故障可恢复性。
综上所述,云原生应用应该具备以下几个关键词:
敏捷
可靠
高弹性
易扩展
故障隔离保护
不中断业务持续更新
以上特性也是云原生区别于传统云应用的优势特点。
从宏观概念上讲,云原生是不同思想的集合,集目前各种热门技术之大成,具体包括如下图所示的几个部分。
微服务
- 应用间通过RESTful API进行通信
- 可以被独立的部署、更新、scale和重启
并不是所有的应用都适合微服务化,也不是说将一个单体应用拆分的越细越好。谈到微服务就不得不提到”十二因素法则“,如下图所示。
DevOps
自动化发布管道、CI工具
快速部署到生产环境
开发、运维协同合作
设计系统的组织,*终产生的设计等同于组织之内、之间的沟通结构。
——康威定律
开发和运维看似是两个貌似互相矛盾的角色。因为开发负责业务的持续迭代,会为系统引入大量的变更,如果系统正在稳定运行,那么每次上线和发布都给系统带来新的风险。而运维追求的是系统可用性、SLA、而变更就意味着可能带来的不稳定。
持续交付
频繁发布、快速交付、快速反馈、降低发布风险
构建自己的CI/CD 持续构建管道与发布流程,如使用Jenkins。
容器化
微服务的*佳载体
容器化*大的好处是保持运行环境的一致性,只要应用可以打包成容器镜像(我们通常使用Docker容器),就可以一次编译,然后到处运行。
同时,容器也可以作为应用运行的*小组件来部署,且更适合作为无状态应用的运行。结合容器编排工具(如Kubernetes)将大大增强系统的扩展性和自愈能力,轻松应对大流量下的高并发场景,加快业务的迭代速度,Kubernetes作为CNCF成员的核心,本身就是与云原生应用的理念紧密结合的产物。
云原生中包含的不同思想,与其所解释的云上应用架构应该具备的特性几乎是一一对应的。
DevOps、持续交付对应更快的上线速度,即敏捷性。
微服务对应可扩展性及故障可恢复性。
敏捷基础设施实现了扩展能力的资源层支持。
康威定律在组织机构和流程上确保架构特性能够快速实施。
后记
云时代的云原生应用大势已来,将传统的单体架构应用迁移到云原生架构上,你准备好了吗?
俗话说,意识决定行动。在迁移到云原生应用之前,我们需要先对 Cloud Native(云原生)的概念、组织形式、实现技术有一个大概的了解,这样才能真正进入到云原生架构实践中。
公有云大行其道,私有云厂商也不断涌现,为了业务的快速迭代,为了快速形成自己的产业生态,各个业务需求方都在积*的评估和采纳公有云方案。
真正的云原生应用架构不应该限制应用的开发语言和架构选择,虽然目前以Java应用的开发者居多,在云原生概念出来之前就已经积累了不少分布式应用管理经验,如Netflix OSS。
实际上云原生应用架构应该适用于任何应用类型。云原生应用架构适用于异构语言的程序开发,不仅仅是针对Java语言。目前云原生应用生态系统已经初具规模,CNCF成员不断发展壮大,基于Cloud Native的创业公司不断涌现,Kubernetes引领容器编排潮流和 Service Mesh技术,Go语言的兴起等,这些都为将传统应用迁移到云原生架构提供了更多的选择。
————————————————
原文链接:https://blog.csdn.net/broadview2006/article/details/80131068
断开 Wi-Fi 连接后,经常出现其他 APP 可以正常上网,微信不行的现象,向各位请教下解决方法。
已将微信的电源管理设置为不优化; APN 设置为 CMNET (移动);首选网络类型设置为 LTE Only 。
两部手机( Sony Xperia XZ2 、红米 K20 )都有这个问题,刷的都是官方 Lineage OS 17.1 。
21 条回复 • 2021-01-08 22:56:19 +08:00
|
|
1
systemcall 94 天前
要运行微信 OS,手机 ROM 里要放上相关的 SDK 。不然对微信 OS 支持不好
|
|
|
2
dexter 94 天前
哪些 os 相关 sdk?
|
|
|
3
kokutou 94 天前
叹号去了吗?
|
|
|
4
PhaSelEza 94 天前 1
@kokutou 是指 Captive Portal 吗?我都用这个命令关掉了。
adb shell settings put global captive_portal_mode 0
|
|
|
5
hydraegret 94 天前 1
pixel 上的微信都会比 pc 延迟收到消息,约延迟 1-3 分钟。
|
|
|
6
Maboroshii 94 天前 via Android 1
关掉 volte 试试。 我的小米 8 类原生系统都有这个问题。WiFi 回到 4g 会出现 dns 请求发不出去的情况,关掉 volte 就好了
|
|
|
7
kokutou 94 天前 via Android 1
@PhaSelEza
打开换个可以正常使用的服务器
比如小米的
|
|
|
8
madpecker009 94 天前 via Android
@hydraegret 小米 8 也延迟 不过没你的这么离谱 也就是在 3s 左右
|
|
|
9
YvanGu 94 天前
华为 EMUI 上微信也延迟,3-5 分钟,电脑端登陆的情况下。
|
|
|
10
HankAviator 94 天前 via Android 1
米 6 los17.1,未电池优化,play 版微信没有问题。
私人 dns 已关闭。
|
|
|
11
Lin0936 94 天前
pixel3 上 play 版微信没发现延迟断流,甚至感觉比 iOS 推送还快一点
|
|
|
12
alfchin 94 天前 via iPhone
@YvanGu 那是功能吧。。。
|
|
|
13
treblex 94 天前
请问这个 rom,键盘收起之后,下半屏无法点击的 bug 修复了吗
|
|
|
14
YvanGu 94 天前
@alfchin 额。。。手机端晚于电脑端收到信息有什么有利的功能嘛?
|
|
|
15
PhaSelEza 94 天前
感谢各位的答复。我开启了 Captive Portal (网址设置为谷歌中国),关闭了私人 DNS,关闭了 VOLTE 。现在似乎正常了,我再试用几天。
|
|
|
16
PhaSelEza 94 天前
@suke971219 日常使用中没有遇到这个 bug,有什么可以复现的方法吗?
|
|
|
17
treblex 94 天前
@PhaSelEza #16 开发 app 时候遇到的 可能需要做兼容吧,就是比较靠近底部的 input,点击输入再取消就会遇到
|
|
|
18
bclerdx 94 天前 via Android
@PhaSelEza 你怎么关掉 CaptivePortal 的。
|
|
|
19
q197 94 天前
@bclerdx adb 执行他写的那段代码
|
|
|
20
bclerdx 94 天前 via Android
@q197 明白。多谢。
|
|
|
21
bclerdx 91 天前
@q197 那么 Google Android 原生系统从 5.0-11,Captive Portal 探测的是哪个具体网址或域名呢?
|
云计算提供了对无限IT资源的按需付费的商业模式,但从技术架构上看,还需要一个用于构建和运行云原生应用的平台,来实践敏捷开发、DevOps、容器编排,微服务和容器化等理论和方法。
云原生平台
敏捷开发
一种小规模团队的、全栈式的开发方法,要求团队具备快速响应变化,快速迭代开发的能力。
*佳实践
scrum
xp
DevOps
开发和运维之间保持流程连续的协作方法,目标是快速、频繁且更可靠地构建、测试和发布软件。
*佳实践
Jenkins
GitLab
容器编排
一种容器资源的管理方法,目标是管理容器集群和调度容器化应用。
*佳实践
Kubernetes
Docker Swarm
Mesos
云原生应用
微服务
是将大型应用作为小型服务集合进行开发的架构方法,其中每个服务都可实现业务功能,在自己的流程中运行并通过 HTTP API 进行通信。每个微服务都可以独立于其它服务进行部署、升级、扩展和重新启动,通常作为自动化系统的一部分运行,可以在不影响*终客户的情况下频繁更新正在使用中的应用。
*佳实践
Spring Boot
Spring Cloud
Jhipster
容器化
与虚拟机相比,容器能同时提供更好的效率和启动速度。每个容器都具有唯一的可写文件系统和资源配额。创建和删除容器的开销较低,在单个虚拟机上能通过容器化充分利用物力资源,这使的容器成为部署微服务的完美工具。
*佳实践
Docker Image
OCI
云原生应用与传统应用
一、简介
该项目集成了三种类型的城市选择器:
1、XXCityPickerView 省市区,可以分级:1省 2省-市 3省-市-区
2、SQSelectAddress 省市区乡/镇,页面跳转
3、RattanCityPicker 省市区,包含邮编地址,开放多个属性设置的接口
二、XXCityPickerView使用
1、从该项目导入【XXCityPickerView】文件包
2、 导入系统库 :libsqlite3.tbd
3、方法实现
1 |
#import “XXCityPickerView.h” |
2 |
|
3 |
@interface ViewController ()<XXCityPickerViewDelegate> |
4 |
|
5 |
@property(nonatomic,strong)XXCityPickerView *cityPicker; |
6 |
|
7 |
@end |
8 |
|
9 |
@implementation ViewController |
10 |
|
11 |
– (void)viewDidLoad { |
12 |
[super viewDidLoad]; |
13 |
} |
14 |
|
15 |
///方法调用 |
16 |
-(void)clickAction{ |
17 |
[self cityPicker]; |
18 |
} |
19 |
|
20 |
– (XXCityPickerView *)cityPicker{ |
21 |
if (_cityPicker == nil){ |
22 |
// 初始化 设置类别 1省 2省-市 3省-市-区 |
23 |
_cityPicker = [[XXCityPickerView alloc]initWithComponents:3]; |
24 |
// 设置代理 |
25 |
_cityPicker.delegate = self; |
26 |
[self.view addSubview:_cityPicker]; |
27 |
} |
28 |
return _cityPicker; |
29 |
} |
4、代理实现
1 |
// —- 【XXCityPickerViewDelegate】 |
2 |
// 取消 |
3 |
– (void)XXCityPickerViewLeftAction{ |
4 |
[self removeCityPickerView]; |
5 |
} |
6 |
// 完成 |
7 |
– (void)XXCityPickerViewRightAction:(XXCityPickerView *)picker andCity:(NSString *)city andData:(NSMutableDictionary *)dic{ |
8 |
[self removeCityPickerView]; |
9 |
NSLog(@”������XXCityPickerView:\n city= %@ dic= %@”,city,dic); |
10 |
} |
11 |
|
12 |
-(void)removeCityPickerView{ |
13 |
if (_cityPicker) { |
14 |
[_cityPicker removeFromSuperview]; |
15 |
_cityPicker = nil; |
16 |
} |
17 |
} |
三、SQSelectAddress使用
1、导入【SQSelectAddress】文件包
2、调用【SQSelectAddressViewController.h】类
3、协议声明
@interface ViewController ()<SQSelectAddressViewControllerDelegate>
1
4、方法实现
pragma mark –
#pragma mark – SQSelectAddress
///页面添加
-(void)sqSelectAddressPockerView{
SQSelectAddressViewController *selectAddressVC = [[SQSelectAddressViewController alloc] init];
//签署协议
selectAddressVC.delegate = self;
selectAddressVC.animating = NO;
selectAddressVC.footerBg_color = [UIColor greenColor];
selectAddressVC.headerBg_color = [UIColor greenColor];
selectAddressVC.title_font = [UIFont systemFontOfSize:25];
selectAddressVC.titleText_color = [UIColor orangeColor];
[self presentViewController:selectAddressVC animated:YES completion:nil];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5、代理协议实现
– (void)selectAddressViewController:(SQSelectAddressViewController *)selectController selectedDetailAdreess:(NSString *)address townCode:(NSString *)townCode{
NSLog(@”����SQSelectAddress:\n地址=%@ 编码=%@”,address,townCode);
}
1
2
3
四、RattanCityPicker使用
1、导入[RattanCityPicker]文件包
2、方法实现
#import “RattanCityPicker.h”
#pragma mark –
#pragma mark – RattanCityPicker
-(void)rattanCity{
RattanCityPicker *picker=[[RattanCityPicker alloc] init];
picker.animation_dur = 0.3;
picker.toolViewBg_color =[UIColor greenColor];
picker.componentFir_font = [UIFont systemFontOfSize:16];
picker.componentStrFir_color = [UIColor redColor];;
picker.componentBgFir_color = [UIColor lightGrayColor];
picker.selectLblStr_font = [UIFont systemFontOfSize:20];
picker.selectLblStr_color = [UIColor redColor];
//点击确定按钮代码块调用
picker.sureBtnBlock = ^(){
};
//获取选择的城市的信息
[picker cityPikerGetSelectCity:^(NSMutableDictionary *dicSelectCity) {
[self setTextLbl:dicSelectCity];
NSLog(@”����RattanCityPicker:\n%@”,dicSelectCity);
}];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
试过用 SSHDroid 把 Android 当成 SSH 服务,但电脑有时候能通过 ssh 访问安卓,有时候不能访问。
安卓有休眠机制,但网络会休眠吗? 22 端口有访问的时候不能唤醒设备吗?
或者自己在安卓上弄一个 ftp 服务器监听 21 端口,能让 21 端口实时访问吗?同时又希望在长期没有其他设备访问的时候又基本不增加耗电。
10 条回复 • 2021-01-09 00:30:06 +08:00
|
|
1
linhua 92 天前
国产安卓系统会限制后台程序的运行,在应用程序设置里 设置成 不限制 就可以了。
小米的是在 应用设置–省点策略 里,如果设置成 智能限制后台运行,则不接电源,过一会就不能访问,如果接通电源,则一直可访问。 设置成 无限制,不管是否接通电源,始终可访问。
|
|
|
2
zictos 92 天前
@linhua #1
我是三星的,已经把 SSHDroid 设为自动运行,取消电池优化以及取消手机自带的省电。
我其他需要保持后台运行的软件都是这么设置的,像 tasker 都可以保持长期后台运行。
但我发现 SSHDroid 其实并不需要后台,他运行的时候在进程看到实际是运行了一个 shell 脚本,即便把 SSHDroid 的后台关掉或者强制结束,但 ssh 服务依然可用,只是屏幕关掉一段时间后就很可能无法连接了,屏幕开启后不需要再次启动又能直接连接。
|
|
|
3
zictos 92 天前
@linhua #1 很多后台运行的程序也会休眠的,需要自己定时唤醒,所以做不到实时
|
|
|
4
tanranran 92 天前
root 后把应用转为系统应用
|
|
|
5
Jirajine 92 天前
和应用后台没关系吧。adbd 是系统进程,我用 adb shell,手机息屏以后反应也非常慢,亮屏才能恢复正常。应该与 Android 内核专门的调度有关。
|
|
|
6
zictos 92 天前
@tanranran #4 如果是自己运行 shell 脚本是只需要把 shell 脚本移到 /system/bin 目录下吗?
试了用幸运破解器把 SSHDroid 移到系统目录,实际只是把 apk 移到了 /system/priv-app 下,但 data/data 下的数据还在原来的地方,而 SSHDroid 默认是会启动 data/data 下的 shell 脚本,即便程序退出了脚本还会运行
|
|
|
7
zictos 92 天前
@Jirajine #5 我倒不是慢,而是有时候根本连不上。
|
|
|
8
linhua 92 天前
我用的 SSHelper
|
|
|
9
zictos 92 天前
@linhua #8 其实仔细想了想也没什么远程需求,用 adb 网络调试也行。
我现在好像可以后台运行 shell 脚本和 python 脚本了,也没必要用 SSHDroid 了。像下面这样就行:
setsid ./test.sh &
试着用 python 开了一个 tcp 长连接,每隔几秒就向服务器发一条消息,这样手机居然不会休眠,没有获取唤醒锁,服务器一直可以收到消息。
还有一个 ftp 服务器监听 21 端口,不知道会不会增加耗电,不知道会不会影响手机休眠
|
|
|
10
systemcall 91 天前 via Android
@zictos /system 默认情况下是只读的,所以即便是系统应用,数据也在 /data 下。但是系统应用在早期版本的安卓有很高的权限,*近的几个大版本虽然没那么高的权限了但还是有些地方比用户应用权限高
脚本放在 /data 没问题,/system/bin 里面不应该放自己的脚本吧,虽然放进去好像也没多大问题
要开机启动,直接改 Linux 层的启动脚本就行了
|
感觉广播比 Handler 方便多了,直接就 send,不用先传个实例才能回话
8 条回复 • 2021-01-08 10:38:47 +08:00
|
|
1
MaL 92 天前 via Android
如果是一般广播的话,那就太重了,可以用本地广播或 eventbus
|
|
|
2
Helsing 92 天前 via iPhone
尽量少用吧,要不*后到处都是满天飞的广播,看的头大
|
|
|
3
towry 92 天前
不要只考虑写的时候有多爽,要考虑以后容不容易修改 /调试
|
|
|
4
wolegequ 92 天前
能用就行,产品有人用再说. 某宝的 app 卡成翔也没见他们优化
|
|
|
5
kop1989 92 天前
软件开发层面就是不好维护。
广播相当于是一个低耦合链接。
假设你有需求要修改某个广播的信息格式或者传参数量。
这时候编译器帮不了你,你很难确认你发送端和接收端都改对了 /改全了。只能不断的测试。
而且细节处理不好还会有安全性问题。
|
|
|
6
k10ndike 92 天前 1
可以用 LiveData
|
|
|
7
jinhan13789991 92 天前
我目前是维护很多 LiveData,说白了就是另一种广播。
只不过发送和订阅都抽成了独立的接口。优点就是不会混乱,缺点就是每次有新的需求就要再写一个专门的方法。
后面在考虑抽成一个通用的方法,通过枚举保证唯一。
|
|
|
8
BrokenVns 92 天前 2
广播是基于异步 binder 的,异步 binder 存在以下小问题:
1.能够传递的数据量是同步 binder 的一半( 0.5M-4K ).
2.异步 binder 的消息传递优先级不高,可能会出现广播接收延迟问题,这种现象在 binder 流量大的老机器更明显。
3.你不知道异步 binder 传递是否成功了,碰到过通信失败而引发的 ANR 问题。
广播自身也有些小问题,比如广播要先发送给 AMS 再由 AMS 进行分发,跨了两次进程,广播是透明的等。
少量使用动态广播,可以减少开发量。
大量使用异步通信的话,还是建议使用 Looper-Handler 、开源库或者造轮子
|
Activity 为什么要有 onStart 生命周期? 直接用 onResume 不行吗?
两个 Activity 切换时, 它们的生命周期顺序是
… A#onPause B#onCreate B#onStart B#onResume A#onStop …
这样安排顺序我能理解, 在 A 显示的时候让 B 显示, B 完全展示后, A 走 onStop, 这样用户界面不会黑屏.
但有个疑问, B Activity 展示的回调中为什么要多一个 onStart, 直接通知正在展示的 Activity onRESUME 不行吗
8 条回复 • 2021-01-15 14:13:56 +08:00
|
|
1
also24 92 天前
我觉得谷歌是希望能严格区分 onPause() 和 onStop() 的。
所以对应着搞了 onResume() 和 onStart() 作为对应的恢复状态。
实际上 Google 确实专门讲了 onPause() 和 onStop() 的差异:
https://developer.android.com/guide/components/activities/activity-lifecycle
|
|
|
2
janus77 92 天前 via iPhone
onresume 是 ui 渲染了,有些特殊的需求是希望在渲染之前执行,或者在进入后台(不渲染)的时候扔会执行。所以就需要 onstart 和 onstop
|
|
|
3
RikkaW 92 天前 5
分屏、画中画等等屏幕上不止一个 Activity (窗口)的情况下就是只有处于焦点的那个是 resumed 状态,其他的都是 started 状态。
|
|
|
4
zagfai 92 天前 1
Android 给开发者制定的架构就是一坨翔
|
|
|
5
rosu 92 天前 via Android
start 是可见,resume 是焦点。
|
|
|
6
narutow 92 天前
@RikkaW 感谢, 理解了, onStart 和 onRESUME 就是界面可见 和 获得焦点可以同用户交互 的两个回调. 其他比如多窗口可以看到, 但不能交互的情况, Activity 就处于 onPause
|
|
|
7
kraits 92 天前 via Android 1
楼主有没有考虑到 Activity 横竖屏切换的生命周期:
onSaveInstanceState()→onPause()→onStop()→onDestroy()→onCreate()→onStart()→onRestoreInstanceState()→onResume()
|
|
|
8
fromzero 85 天前
onStart onRestart 都是满有用的。
|
1. 框架介绍
BRPickerView 封装的是iOS中常用的选择器组件。高度封装,只需一句代码即可完成调用,使用比较灵活支持自定义主题颜色。选择器类型主要包括:日期选择器、时间选择器、地址选择器、自定义字符串选择器。
框架地址:github.com/91renb/BRPi…
【特别提示】:
- 当前*新版本为:
2.2.1
。
- 如果不能找到*新版本,请先执行一下
pod setup
,待更新完成后;再执行 pod search BRPickerView
进行搜索,就会看到*新版本。
2. 效果演示
查看并运行 BRPickerViewDemo.xcodeproj
|
|
框架Demo运行效果图1 |
框架Demo运行效果图2 |
3. 更新记录
- 2018-04-27(V2.2.1):
- 修复bug,适配iPad和横屏显示。
- 优化代码,提高框架适应性,降低内存消耗。
- 2018-04-03(V2.2.0):
- 时间选择器新添加了7种显示类型(BRDatePickerMode),可根据自己项目的需求选择性使用。
- 适配横屏,及 iPhoneX 底部安全区域。
- 修改了*小时间和*大时间的参数名称(以前版本是传 NSString 类型, 现在传 NSDate 类型)
- 修复比较时间大小时出现的bug。
- 2018-03-19(V2.1.3):
- 修改地址选择器确认选择后的回调参数。
- 现修改如下:可通过省市区的模型获取省市区的 name(名称)、code(id)、index(索引)
resultBlock:^(BRProvinceModel *province, BRCityModel *city, BRAreaModel *area) {}
- 去掉第三方依赖库
MJExtension
,修改为手动解析地址数据源。
- 2018-03-11(V2.1.2):
- 重命名了Github用户名,更新项目相关的路径。(提示:pod之前的版本不受影响)
- 2018-02-28(V2.1.1):
- 修复某些情况下无法用bundle加载本地数据源(BRCity.plist)bug。
- 2018-01-26(V2.1.0):
- 给地址选择器添加了一个方法(见方法4),提供数据源参数,支持外部传入地区数据源。
- 提示:要注意数据源格式,参考 BRCity.json。可以把 BRCity.json 文件的内容放到后台去维护,通过后台接口获取地区数据源(即 BRCity.json 文件的内容)。
- 2018-01-25(V2.0.0):
- 更新了地址数据源(BRCity.plist),地区信息是2018年*新*全的,与微信的地区信息完全一致。
- 支持自定义默认选择地址(格式:@[@”浙江省”, @”杭州市”, @”西湖区”]),支持下次点击进入地址选择器时,默认地址为上次选择的结果。
- 修改了日期选择器、地址选择器、字符串选择器的接口方法(删除了之前的方法2)。
- 添加了地址选择器显示类型,支持3种显示:只显示省份、显示省份和城市、显示省市区。
- 2018-01-05(V1.3.0):
- 2018-01-02(V1.2.0):
- 2017-11-26(V1.1.0):
- 2017-11-16(V1.0.0):
4. 安装
4.1. CocoaPods
- 在 Podfile 中添加
pod 'BRPickerView'
。
- 执行
pod install
或 pod update
。
- 导入头文件
#import <BRPickerView.h>
。
4.2. 手动导入
- 将与
README.md
同级目录下的 BRPickerView
文件夹拽入项目中
- 导入头文件
#import "BRPickerView.h"
。
5. 系统要求
6. 使用
6.1. 时间选择器:BRDatePickerView
查看 BRDatePickerView.h 头文件,里面提供了3个方法,可根据自己的需求选择其中的一个方法进行使用。
-
-
-
-
-
-
-
-
-
-
+ (void)showDatePickerWithTitle:(NSString *)title
-
dateType:(BRDatePickerMode)dateType
-
defaultSelValue:(NSString *)defaultSelValue
-
resultBlock:(BRDateResultBlock)resultBlock;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ (void)showDatePickerWithTitle:(NSString *)title
-
dateType:(BRDatePickerMode)dateType
-
defaultSelValue:(NSString *)defaultSelValue
-
minDate:(NSDate *)minDate
-
maxDate:(NSDate *)maxDate
-
isAutoSelect:(BOOL)isAutoSelect
-
themeColor:(UIColor *)themeColor
-
resultBlock:(BRDateResultBlock)resultBlock;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ (void)showDatePickerWithTitle:(NSString *)title
-
dateType:(BRDatePickerMode)dateType
-
defaultSelValue:(NSString *)defaultSelValue
-
minDate:(NSDate *)minDate
-
maxDate:(NSDate *)maxDate
-
isAutoSelect:(BOOL)isAutoSelect
-
themeColor:(UIColor *)themeColor
-
resultBlock:(BRDateResultBlock)resultBlock
-
cancelBlock:(BRDateCancelBlock)cancelBlock;
-
-
NSDate *minDate = [NSDate br_setYear:1990 month:3 day:12];
-
NSDate *maxDate = [NSDate date];
-
[BRDatePickerView showDatePickerWithTitle:@“出生日期” dateType:BRDatePickerModeYMD defaultSelValue:weakSelf.birthdayTF.text minDate:minDate maxDate:maxDate isAutoSelect:YES themeColor:nil resultBlock:^(NSString *selectValue) {
-
weakSelf.birthdayTF.text = selectValue;
-
-
-
-
-
-
typedef NS_ENUM(NSInteger, BRDatePickerMode) {
-
-
-
-
-
-
-
BRDatePickerModeDateAndTime,
-
-
BRDatePickerModeCountDownTimer,
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
以下4种样式是使用 UIDatePicker 类 进行封装的,支持循环滚动
|
|
样式1:BRDatePickerModeTime |
样式2:BRDatePickerModeDate |
|
|
|
|
样式3:BRDatePickerModeDateAndTime |
样式4:BRDatePickerModeCountDownTimer |
以下7种样式是使用 UIPickerView 类 进行封装的。
|
|
样式5: BRDatePickerModeYMDHM |
样式6: BRDatePickerModeMDHM |
|
|
|
|
样式7: BRDatePickerModeYMD |
样式8: BRDatePickerModeYM |
|
|
|
|
样式9: BRDatePickerModeY |
样式10: BRDatePickerModeMD |
|
|
|
|
样式11: BRDatePickerModeHM |
|
6.2. 地址选择器:BRAddressPickerView
查看 BRAddressPickerView.h 头文件,里面提供了4个方法,可根据自己的需求选择其中的一个方法进行使用。
-
-
-
-
-
-
-
-
+ (void)showAddressPickerWithDefaultSelected:(NSArray *)defaultSelectedArr
-
resultBlock:(BRAddressResultBlock)resultBlock;
-
-
-
-
-
-
-
-
-
-
-
+ (void)showAddressPickerWithDefaultSelected:(NSArray *)defaultSelectedArr
-
isAutoSelect:(BOOL)isAutoSelect
-
themeColor:(UIColor *)themeColor
-
resultBlock:(BRAddressResultBlock)resultBlock;
-
-
-
-
-
-
-
-
-
-
-
-
-
+ (void)showAddressPickerWithShowType:(BRAddressPickerMode)showType
-
defaultSelected:(NSArray *)defaultSelectedArr
-
isAutoSelect:(BOOL)isAutoSelect
-
themeColor:(UIColor *)themeColor
-
resultBlock:(BRAddressResultBlock)resultBlock
-
cancelBlock:(BRAddressCancelBlock)cancelBlock;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ (void)showAddressPickerWithShowType:(BRAddressPickerMode)showType
-
dataSource:(NSArray *)dataSource
-
defaultSelected:(NSArray *)defaultSelectedArr
-
isAutoSelect:(BOOL)isAutoSelect
-
themeColor:(UIColor *)themeColor
-
resultBlock:(BRAddressResultBlock)resultBlock
-
cancelBlock:(BRAddressCancelBlock)cancelBlock;
-
-
-
NSArray *defaultSelArr = [weakSelf.addressTF.text componentsSeparatedByString:@” “];
-
[BRAddressPickerView showAddressPickerWithShowType:BRAddressPickerModeArea defaultSelected:defaultSelArr isAutoSelect:YES themeColor:nil resultBlock:^(BRProvinceModel *province, BRCityModel *city, BRAreaModel *area) {
-
weakSelf.addressTF.text = [NSString stringWithFormat:@“%@ %@ %@”, province.name, city.name, area.name];
-
-
-
-
- 地址选择器的3种显示类型(showType 的3个枚举值):
|
|
样式1:BRAddressPickerModeProvince |
样式2:BRAddressPickerModeCity |
|
|
样式3:BRAddressPickerModeArea |
|
6.3. 自定义字符串选择器:BRStringPickerView
查看 BRStringPickerView.h 头文件,里面提供了3个方法,可根据自己的需求选择其中的一个方法进行使用。
-
-
-
-
-
-
-
-
-
-
+ (void)showStringPickerWithTitle:(NSString *)title
-
dataSource:(id)dataSource
-
defaultSelValue:(id)defaultSelValue
-
resultBlock:(BRStringResultBlock)resultBlock;
-
-
-
-
-
-
-
-
-
-
-
-
-
+ (void)showStringPickerWithTitle:(NSString *)title
-
dataSource:(id)dataSource
-
defaultSelValue:(id)defaultSelValue
-
isAutoSelect:(BOOL)isAutoSelect
-
themeColor:(UIColor *)themeColor
-
resultBlock:(BRStringResultBlock)resultBlock;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ (void)showStringPickerWithTitle:(NSString *)title
-
dataSource:(id)dataSource
-
defaultSelValue:(id)defaultSelValue
-
isAutoSelect:(BOOL)isAutoSelect
-
themeColor:(UIColor *)themeColor
-
resultBlock:(BRStringResultBlock)resultBlock
-
cancelBlock:(BRStringCancelBlock)cancelBlock;
-
-
-
-
NSString *dataSource = @“testData1.plist”;
-
[BRStringPickerView showStringPickerWithTitle:@“学历” dataSource:dataSource defaultSelValue:weakSelf.educationTF.text isAutoSelect:YES themeColor:nil resultBlock:^(id selectValue) {
-
weakSelf.educationTF.text = selectValue;
-
-
-
-
-
-
NSArray *dataSource = @[@[@“第1周”, @“第2周”, @“第3周”, @“第4周”, @“第5周”, @“第6周”, @“第7周”], @[@“第1天”, @“第2天”, @“第3天”, @“第4天”, @“第5天”, @“第6天”, @“第7天”]];
-
-
NSArray *defaultSelArr = [weakSelf.otherTF.text componentsSeparatedByString:@“,”];
-
[BRStringPickerView showStringPickerWithTitle:@“自定义多列字符串” dataSource:dataSource defaultSelValue:defaultSelArr isAutoSelect:YES themeColor:RGB_HEX(0xff7998, 1.0f) resultBlock:^(id selectValue) {
-
weakSelf.otherTF.text = [NSString stringWithFormat:@“%@,%@”, selectValue[0], selectValue[1]];
-
-
-
-
|
|
单列字符串选择器(默认主题色样式) |
双列字符串选择器(自定义主题色样式) |
|
|
3列字符串选择器(自定义主题色样式) |
4列字符串选择器(自定义主题色样式) |
7. 许可证
BRPickerView 使用 MIT 许可证,详情见 LICENSE 文件。