Android 11 系统上 Okhttp 3.10 版本

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

chenjiajia9411
    1

chenjiajia9411   93 天前

混淆有问题,AbstractSource 给弄成 final 了,把 allowaccessmodification 关了,以后上传的日志*好也带上符号表或者直接还原不然不方便看。
还有如果还需要兼容 API 21 以下就把 OkHttp 升级到 3.12.12 ,不需要兼容的话直接升级到 4.9.0 吧。
haydenjie
    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 上开源,感兴趣的读者可浏览或下载。

什么是云原生
云原生准确来说是一种文化,更是一种潮流,它是云计算的一个必然导向。意义在于让云成为云化战略成功的基石,而不是障碍。
自从云的概念开始普及,许多公司都部署了实施云化的策略,纷纷搭建起云平台,希望完成传统应用到云端的迁移。但是这个过程中会遇到一些技术难题,上云以后,效率并没有变得奇高,故障也没有迅速定位。
为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题,云原生这一概念横空出世。云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司的决策。
另外,云原生也很好地解释了云上运行的应用应该具备什么样的架构特性——敏捷性、可扩展性、故障可恢复性。
综上所述,云原生应用应该具备以下几个关键词:

敏捷
可靠
高弹性
易扩展
故障隔离保护
不中断业务持续更新
以上特性也是云原生区别于传统云应用的优势特点。
从宏观概念上讲,云原生是不同思想的集合,集目前各种热门技术之大成,具体包括如下图所示的几个部分。
%title插图%num

微服务

  • 应用间通过RESTful API进行通信
  • 可以被独立的部署、更新、scale和重启

并不是所有的应用都适合微服务化,也不是说将一个单体应用拆分的越细越好。谈到微服务就不得不提到”十二因素法则“,如下图所示。

%title插图%num

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

Lineage OS 下微信断流问题

断开 Wi-Fi 连接后,经常出现其他 APP 可以正常上网,微信不行的现象,向各位请教下解决方法。

已将微信的电源管理设置为不优化; APN 设置为 CMNET (移动);首选网络类型设置为 LTE Only 。

两部手机( Sony Xperia XZ2 、红米 K20 )都有这个问题,刷的都是官方 Lineage OS 17.1 。

21 条回复    2021-01-08 22:56:19 +08:00
systemcall
    1

systemcall   94 天前

要运行微信 OS,手机 ROM 里要放上相关的 SDK 。不然对微信 OS 支持不好
dexter
    2

dexter   94 天前

哪些 os 相关 sdk?
kokutou
    3

kokutou   94 天前

叹号去了吗?
PhaSelEza
    4

PhaSelEza   94 天前   ❤️ 1

@kokutou 是指 Captive Portal 吗?我都用这个命令关掉了。

adb shell settings put global captive_portal_mode 0

hydraegret
    5

hydraegret   94 天前   ❤️ 1

pixel 上的微信都会比 pc 延迟收到消息,约延迟 1-3 分钟。
Maboroshii
    6

Maboroshii   94 天前 via Android   ❤️ 1

关掉 volte 试试。 我的小米 8 类原生系统都有这个问题。WiFi 回到 4g 会出现 dns 请求发不出去的情况,关掉 volte 就好了
kokutou
    7

kokutou   94 天前 via Android   ❤️ 1

@PhaSelEza
打开换个可以正常使用的服务器
比如小米的
madpecker009
    8

madpecker009   94 天前 via Android

@hydraegret 小米 8 也延迟 不过没你的这么离谱 也就是在 3s 左右
YvanGu
    9

YvanGu   94 天前

华为 EMUI 上微信也延迟,3-5 分钟,电脑端登陆的情况下。
HankAviator
    10

HankAviator   94 天前 via Android   ❤️ 1

米 6 los17.1,未电池优化,play 版微信没有问题。
私人 dns 已关闭。
Lin0936
    11

Lin0936   94 天前

pixel3 上 play 版微信没发现延迟断流,甚至感觉比 iOS 推送还快一点
alfchin
    12

alfchin   94 天前 via iPhone

@YvanGu 那是功能吧。。。
treblex
    13

treblex   94 天前

请问这个 rom,键盘收起之后,下半屏无法点击的 bug 修复了吗
YvanGu
    14

YvanGu   94 天前

@alfchin 额。。。手机端晚于电脑端收到信息有什么有利的功能嘛?
PhaSelEza
    15

PhaSelEza   94 天前

感谢各位的答复。我开启了 Captive Portal (网址设置为谷歌中国),关闭了私人 DNS,关闭了 VOLTE 。现在似乎正常了,我再试用几天。
PhaSelEza
    16

PhaSelEza   94 天前

@suke971219 日常使用中没有遇到这个 bug,有什么可以复现的方法吗?
treblex
    17

treblex   94 天前

@PhaSelEza #16 开发 app 时候遇到的 可能需要做兼容吧,就是比较靠近底部的 input,点击输入再取消就会遇到
bclerdx
    18

bclerdx   94 天前 via Android

@PhaSelEza 你怎么关掉 CaptivePortal 的。
q197
    19

q197   94 天前

@bclerdx adb 执行他写的那段代码
bclerdx
    20

bclerdx   94 天前 via Android

@q197 明白。多谢。
bclerdx
    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
云原生应用与传统应用

%title插图%num

 

14 年的 Android 手机如何升级系统?

RT,昨晚爸爸拿了一台 14 年产的手机,型号是酷派 V1-C,系统是 Android 4.4.4 的,问我还能不能用?我看了一下配置,处理器是骁龙 801,运存 3G,勉强还可以用。但是因为系统太老,连微信都无法安装,这个手机型号在网上也没找到刷机包,还有救吗?能否有其它办法升级系统? PS:这手机 2K(2560×1440)超清屏,491PPI,wifi 还支持 5G 频段,物理隔离双系统…这些配置和功能挺超前的啊,前几年都还有其它厂商拿来出吹呢…以前酷派这个品牌确实挺火的,现在怎么感觉在垂死边缘了?

第 1 条附言  ·

看了一下各位的建议,好像基本没戏。APP 老版本我尝试过,虽然可以用,但是部分功能模块会出问题。我是准备给他选一个红米的,想着又便宜性能又好,但因为他现在用的是华为(他不懂手机,平常也就玩玩微信,刷刷抖音啥的),问他想要什么手机,他也只知道华为,我又担心如果不给他买华为,他用着出啥问题还得我背锅。
2000 以内的华为手机各位有什么好推荐的吗?
27 条回复    2021-02-07 04:01:03 +08:00
gam2046
    1

gam2046   107 天前

酷派大概率就节哀吧

Android 4 和 Android 7 的 HAL 层有大改,vendor 几乎没有可能直接重用。要不 HAL 层对应的修改,要不该 vendor 。前者工程量巨大,后者你没源码,有也同样有非常大的工程量。

有这精力,还不如买个新的千元机。

ysc3839
    2

ysc3839   107 天前 via Android

801 的话理论上能跑 Android 10 的。比如三星 S5 仍然可以运行基于 Android 10 的 LineageOS 。
但是对于非热门机型那还是别想了,除非你愿意自己适配。
LiYanHong
    3

LiYanHong   107 天前

看看老点版本的微信还能用不咯
hikari2
    4

hikari2   106 天前

早期安卓分为支持安卓 5 和不支持的,支持安卓 5 的基本上都能上 789
gason406
    5

gason406   106 天前   ❤️ 1

当年还在吹中华酷联米的,*后混出来的也就剩华为小米了
ShallowAi
    6

ShallowAi   106 天前 via Android

14 年能解锁 BL 或者预先解锁的安卓机 只要还有人做包那就能升级

酷派啊 早跑路了 基本没人做了 你要是说小米 2s 都还有安卓 10

PhxNirvana
    7

PhxNirvana   106 天前

801 应该是 32 位 cpu,可以放弃了
Lemeng
    8

Lemeng   106 天前

酷派啊,熟悉又陌生的名字
hfJ433
    9

hfJ433   106 天前   ❤️ 6

老丈人的意思想你买部新手机给他,让你表现一下。
a5b6c7d8
    10

a5b6c7d8   106 天前 via Android

1599 软妹币就可以升级吧

hantsy
    11

hantsy   106 天前

太老了,建议 800 块升级红米。
JensenQian
    12

JensenQian   106 天前

14 年的手机还是换个新的吧,现在手机很便宜了,包括 5G 手机,千元以内或者左右都有挺好的选择,
JensenQian
    13

JensenQian   106 天前

@JensenQian #12 这机子翻了下真的没啥包了,我之前小米 4 刷过安卓 10 的魔趣,但是还是卡的不行,基本没法用,801 现在也该退休了,https://www.wandoujia.com/apps/596157/history 豌豆荚有历史版本的微信,*旧的的 5.1 版本的微信,14 年的应该可以装上去
a570295535
    14

a570295535   106 天前

给你个老版本可以正常登录使用的微信,
解压后安装 apk 即可:
https://xsz.lanzous.com/i7iofjoaaqj
noahhhh
    15

noahhhh   106 天前 via Android

买新机吧
fox0001
    16

fox0001   106 天前

掏腰包更新,RMB 大法好~
systemcall
    17

systemcall   106 天前

酷派的可以放弃了,没有厂家的支持哪来的大改动的第三方?
要是是小米 note 也许有戏,也是 801 32 位,官方有新一些的系统
4.4 默认还是 Dalvik 吧,后面都换成 ART 了。系统的结构都差得远。你要是有个安卓 6.0 的原厂固件,倒是有可能改出来新版本系统
CBS
    18

CBS   106 天前

建议给 l 老丈人买个小米 MAX3
miaomiao888
    19

miaomiao888   106 天前

恢复下出厂,6.7.3 的微信包括支付能用,QQ 国际版能用,ZFB 也能用,抖音好像也可以
USAA
    20

USAA   106 天前

百度
V1-C 刷机包
如果有就有,没有就没有
angrylid
    21

angrylid   106 天前 via Android

两千元内华为手机竞争力不强,要不弄台老旗舰,要不荣耀。
dingwen07
    22

dingwen07   106 天前

2000 以内华为手机,如果不包括荣耀,建议不要考虑。
taobibi
    23

taobibi   106 天前

V1-C 这个手机我有同款。当初这个手机叫酷派伯顿(伯爵?)记不清了。
分享一下我的翻车经验
1.这个手机的刷机包止步于 4.4,都是原厂魔改的。没有第三方适配,大概也是双系统的缘故,适配很困难。
2.网上很多刷机包都是 360 定制版本,内置 360 全家桶
3 。有网友发布过去掉安全系统的版本,可以增大存储空间,总之所有系统都是官方安置 4.4 的魔改。老的 CM 也没有适配过。

至于其他用法。我曾经试过把他放在家里转发短信验证码,但是发现这个机器的安全机制很特别,机会任何读短信的 APP 都读不到短信内容,

只有旧货利用的途径,也不是没有
1.这个手机带自动接听功能,可以设置直接自动接听(设置好白名单接听),或者链接蓝牙音箱自动接听,有时候可以放在家里,远程提醒在家的老婆大人给我暖床(划掉)
2.如果你有电信无限流量套餐,可以开热点当个随身路由器用,这是为数不多的支持换电池的手机,电池淘宝依然有售。支持电信 4G 网,热点网速比较理想。

zhhww57
    24

zhhww57   102 天前

VMOS,用 VMOS 模拟高版本 android,或者安装 xposed 的向下兼容模块
DreamingCTW
    25

DreamingCTW   102 天前

@zhhww57 VMOS 不支持 4.4.4 的
amok
    26

amok   74 天前

酷派的旗舰机都不给升级系统的?同期的荣耀 6,配置还不如这个,官方都升 6.0 了。
zhhww57
    27

zhhww57   62 天前

那就试试看移植到 android5 或者 android6,然后再用 vmos

iOS开发:城市选择器集成

一、简介
该项目集成了三种类型的城市选择器:

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
linhua
    1

linhua   92 天前

国产安卓系统会限制后台程序的运行,在应用程序设置里 设置成 不限制 就可以了。
小米的是在 应用设置–省点策略 里,如果设置成 智能限制后台运行,则不接电源,过一会就不能访问,如果接通电源,则一直可访问。 设置成 无限制,不管是否接通电源,始终可访问。
zictos
    2

zictos   92 天前

@linhua #1
我是三星的,已经把 SSHDroid 设为自动运行,取消电池优化以及取消手机自带的省电。
我其他需要保持后台运行的软件都是这么设置的,像 tasker 都可以保持长期后台运行。

但我发现 SSHDroid 其实并不需要后台,他运行的时候在进程看到实际是运行了一个 shell 脚本,即便把 SSHDroid 的后台关掉或者强制结束,但 ssh 服务依然可用,只是屏幕关掉一段时间后就很可能无法连接了,屏幕开启后不需要再次启动又能直接连接。

zictos
    3

zictos   92 天前

@linhua #1 很多后台运行的程序也会休眠的,需要自己定时唤醒,所以做不到实时
tanranran
    4

tanranran   92 天前

root 后把应用转为系统应用
Jirajine
    5

Jirajine   92 天前

和应用后台没关系吧。adbd 是系统进程,我用 adb shell,手机息屏以后反应也非常慢,亮屏才能恢复正常。应该与 Android 内核专门的调度有关。
zictos
    6

zictos   92 天前

@tanranran #4 如果是自己运行 shell 脚本是只需要把 shell 脚本移到 /system/bin 目录下吗?
试了用幸运破解器把 SSHDroid 移到系统目录,实际只是把 apk 移到了 /system/priv-app 下,但 data/data 下的数据还在原来的地方,而 SSHDroid 默认是会启动 data/data 下的 shell 脚本,即便程序退出了脚本还会运行
zictos
    7

zictos   92 天前

@Jirajine #5 我倒不是慢,而是有时候根本连不上。
linhua
    8

linhua   92 天前

我用的 SSHelper
zictos
    9

zictos   92 天前

@linhua #8 其实仔细想了想也没什么远程需求,用 adb 网络调试也行。
我现在好像可以后台运行 shell 脚本和 python 脚本了,也没必要用 SSHDroid 了。像下面这样就行:
setsid ./test.sh &

试着用 python 开了一个 tcp 长连接,每隔几秒就向服务器发一条消息,这样手机居然不会休眠,没有获取唤醒锁,服务器一直可以收到消息。
还有一个 ftp 服务器监听 21 端口,不知道会不会增加耗电,不知道会不会影响手机休眠

systemcall
    10

systemcall   91 天前 via Android

@zictos /system 默认情况下是只读的,所以即便是系统应用,数据也在 /data 下。但是系统应用在早期版本的安卓有很高的权限,*近的几个大版本虽然没那么高的权限了但还是有些地方比用户应用权限高
脚本放在 /data 没问题,/system/bin 里面不应该放自己的脚本吧,虽然放进去好像也没多大问题
要开机启动,直接改 Linux 层的启动脚本就行了

Android 线程间通信全部用广播,有什么坏处吗?

感觉广播比 Handler 方便多了,直接就 send,不用先传个实例才能回话

8 条回复    2021-01-08 10:38:47 +08:00
MaL
    1

MaL   92 天前 via Android

如果是一般广播的话,那就太重了,可以用本地广播或 eventbus
Helsing
    2

Helsing   92 天前 via iPhone

尽量少用吧,要不*后到处都是满天飞的广播,看的头大
towry
    3

towry   92 天前

不要只考虑写的时候有多爽,要考虑以后容不容易修改 /调试
wolegequ
    4

wolegequ   92 天前

能用就行,产品有人用再说. 某宝的 app 卡成翔也没见他们优化
kop1989
    5

kop1989   92 天前

软件开发层面就是不好维护。
广播相当于是一个低耦合链接。
假设你有需求要修改某个广播的信息格式或者传参数量。
这时候编译器帮不了你,你很难确认你发送端和接收端都改对了 /改全了。只能不断的测试。

而且细节处理不好还会有安全性问题。

k10ndike
    6

k10ndike   92 天前   ❤️ 1

可以用 LiveData
jinhan13789991
    7

jinhan13789991   92 天前

我目前是维护很多 LiveData,说白了就是另一种广播。
只不过发送和订阅都抽成了独立的接口。优点就是不会混乱,缺点就是每次有新的需求就要再写一个专门的方法。
后面在考虑抽成一个通用的方法,通过枚举保证唯一。
BrokenVns
    8

BrokenVns   92 天前   ❤️ 2

广播是基于异步 binder 的,异步 binder 存在以下小问题:
1.能够传递的数据量是同步 binder 的一半( 0.5M-4K ).
2.异步 binder 的消息传递优先级不高,可能会出现广播接收延迟问题,这种现象在 binder 流量大的老机器更明显。
3.你不知道异步 binder 传递是否成功了,碰到过通信失败而引发的 ANR 问题。
广播自身也有些小问题,比如广播要先发送给 AMS 再由 AMS 进行分发,跨了两次进程,广播是透明的等。

少量使用动态广播,可以减少开发量。
大量使用异步通信的话,还是建议使用 Looper-Handler 、开源库或者造轮子

Activity 为什么要有 onStart 生命周期?

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
also24
    1

also24   92 天前

我觉得谷歌是希望能严格区分 onPause() 和 onStop() 的。

所以对应着搞了 onResume() 和 onStart() 作为对应的恢复状态。

实际上 Google 确实专门讲了 onPause() 和 onStop() 的差异:
https://developer.android.com/guide/components/activities/activity-lifecycle

janus77
    2

janus77   92 天前 via iPhone

onresume 是 ui 渲染了,有些特殊的需求是希望在渲染之前执行,或者在进入后台(不渲染)的时候扔会执行。所以就需要 onstart 和 onstop
RikkaW
    3

RikkaW   92 天前   ❤️ 5

分屏、画中画等等屏幕上不止一个 Activity (窗口)的情况下就是只有处于焦点的那个是 resumed 状态,其他的都是 started 状态。
zagfai
    4

zagfai   92 天前   ❤️ 1

Android 给开发者制定的架构就是一坨翔
rosu
    5

rosu   92 天前 via Android

start 是可见,resume 是焦点。
narutow
    6

narutow   92 天前

@RikkaW 感谢, 理解了, onStart 和 onRESUME 就是界面可见 和 获得焦点可以同用户交互 的两个回调. 其他比如多窗口可以看到, 但不能交互的情况, Activity 就处于 onPause
kraits
    7

kraits   92 天前 via Android   ❤️ 1

楼主有没有考虑到 Activity 横竖屏切换的生命周期:

onSaveInstanceState()→onPause()→onStop()→onDestroy()→onCreate()→onStart()→onRestoreInstanceState()→onResume()

fromzero
    8

fromzero   85 天前

onStart onRestart 都是满有用的。

iOS选择器组件

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):
    • 添加取消选择的回调方法(点击背景或取消按钮会执行 cancelBlock )
    • 合并了字符串选择器 数组数据源和plist数据源对应的方法,dataSource 参数支持两种类型:

      1> 可以直接传数组:NSArray类型;

      2> 可以传plist文件名:NSString类型,带后缀名,plist文件的内容必须是数组格式。

  • 2018-01-02(V1.2.0)
    • 添加支持自定义主题颜色的方法。
  • 2017-11-26(V1.1.0)
    • 更换第三方依赖库。

      用MJExtension 替换了 原来的YYModel,以前没有注意导入YYModel,同时又导入YYKit会导致重复导入而冲突(另外使用YYModel时,手动导入和pod导入 其中的头文件和方法名也不一样,所以很容易出错)。

  • 2017-11-16(V1.0.0)
    • 初始版本!

4. 安装

4.1. CocoaPods

  1. 在 Podfile 中添加 pod 'BRPickerView'
  2. 执行 pod install 或 pod update 。
  3. 导入头文件 #import <BRPickerView.h>

4.2. 手动导入

  1. 将与 README.md 同级目录下的 BRPickerView 文件夹拽入项目中
  2. 导入头文件 #import "BRPickerView.h"

5. 系统要求

  • iOS 8.0+
  • ARC

6. 使用

6.1. 时间选择器:BRDatePickerView

​ 查看 BRDatePickerView.h 头文件,里面提供了3个方法,可根据自己的需求选择其中的一个方法进行使用。

  1. /**
  2. * 1.显示时间选择器
  3. *
  4. * @param title 标题
  5. * @param dateType 日期显示类型
  6. * @param defaultSelValue 默认选中的时间(值为空/值格式错误时,默认就选中现在的时间)
  7. * @param resultBlock 选择结果的回调
  8. *
  9. */
  10. + (void)showDatePickerWithTitle:(NSString *)title
  11. dateType:(BRDatePickerMode)dateType
  12. defaultSelValue:(NSString *)defaultSelValue
  13. resultBlock:(BRDateResultBlock)resultBlock;
  14. /**
  15. * 2.显示时间选择器(支持 设置自动选择 和 自定义主题颜色)
  16. *
  17. * @param title 标题
  18. * @param dateType 日期显示类型
  19. * @param defaultSelValue 默认选中的时间(值为空/值格式错误时,默认就选中现在的时间)
  20. * @param minDate *小时间,可为空(请使用 NSDate+BRPickerView 分类中和显示类型格式对应的方法创建 minDate)
  21. * @param maxDate *大时间,可为空(请使用 NSDate+BRPickerView 分类中和显示类型格式对应的方法创建 maxDate)
  22. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  23. * @param themeColor 自定义主题颜色
  24. * @param resultBlock 选择结果的回调
  25. *
  26. */
  27. + (void)showDatePickerWithTitle:(NSString *)title
  28. dateType:(BRDatePickerMode)dateType
  29. defaultSelValue:(NSString *)defaultSelValue
  30. minDate:(NSDate *)minDate
  31. maxDate:(NSDate *)maxDate
  32. isAutoSelect:(BOOL)isAutoSelect
  33. themeColor:(UIColor *)themeColor
  34. resultBlock:(BRDateResultBlock)resultBlock;
  35. /**
  36. * 3.显示时间选择器(支持 设置自动选择、自定义主题颜色、取消选择的回调)
  37. *
  38. * @param title 标题
  39. * @param dateType 日期显示类型
  40. * @param defaultSelValue 默认选中的时间(值为空/值格式错误时,默认就选中现在的时间)
  41. * @param minDate *小时间,可为空(请使用 NSDate+BRPickerView 分类中和显示类型格式对应的方法创建 minDate)
  42. * @param maxDate *大时间,可为空(请使用 NSDate+BRPickerView 分类中和显示类型格式对应的方法创建 maxDate)
  43. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  44. * @param themeColor 自定义主题颜色
  45. * @param resultBlock 选择结果的回调
  46. * @param cancelBlock 取消选择的回调
  47. *
  48. */
  49. + (void)showDatePickerWithTitle:(NSString *)title
  50. dateType:(BRDatePickerMode)dateType
  51. defaultSelValue:(NSString *)defaultSelValue
  52. minDate:(NSDate *)minDate
  53. maxDate:(NSDate *)maxDate
  54. isAutoSelect:(BOOL)isAutoSelect
  55. themeColor:(UIColor *)themeColor
  56. resultBlock:(BRDateResultBlock)resultBlock
  57. cancelBlock:(BRDateCancelBlock)cancelBlock;
  58. 复制代码
  • 使用示例(参考Demo):
  1. NSDate *minDate = [NSDate br_setYear:1990 month:3 day:12];
  2. NSDate *maxDate = [NSDate date];
  3. [BRDatePickerView showDatePickerWithTitle:@“出生日期” dateType:BRDatePickerModeYMD defaultSelValue:weakSelf.birthdayTF.text minDate:minDate maxDate:maxDate isAutoSelect:YES themeColor:nil resultBlock:^(NSString *selectValue) {
  4. weakSelf.birthdayTF.text = selectValue;
  5. } cancelBlock:^{
  6. NSLog(@“点击了背景或取消按钮”);
  7. }];
  8. 复制代码
  • 时间选择器的显示类型:
  1. /// 弹出日期类型
  2. typedef NS_ENUM(NSInteger, BRDatePickerMode) {
  3. // — 以下4种是系统自带的样式 —
  4. // UIDatePickerModeTime
  5. BRDatePickerModeTime, // HH:mm
  6. // UIDatePickerModeDate
  7. BRDatePickerModeDate, // yyyy-MM-dd
  8. // UIDatePickerModeDateAndTime
  9. BRDatePickerModeDateAndTime, // yyyy-MM-dd HH:mm
  10. // UIDatePickerModeCountDownTimer
  11. BRDatePickerModeCountDownTimer, // HH:mm
  12. // — 以下7种是自定义样式 —
  13. // 年月日时分
  14. BRDatePickerModeYMDHM, // yyyy-MM-dd HH:mm
  15. // 月日时分
  16. BRDatePickerModeMDHM, // MM-dd HH:mm
  17. // 年月日
  18. BRDatePickerModeYMD, // yyyy-MM-dd
  19. // 年月
  20. BRDatePickerModeYM, // yyyy-MM
  21. // 年
  22. BRDatePickerModeY, // yyyy
  23. // 月日
  24. BRDatePickerModeMD, // MM-dd
  25. // 时分
  26. BRDatePickerModeHM // HH:mm
  27. };
  28. 复制代码
  • 时间选择器显示类型的效果图:

以下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个方法,可根据自己的需求选择其中的一个方法进行使用。

  1. /**
  2. * 1.显示地址选择器
  3. *
  4. * @param defaultSelectedArr 默认选中的值(传数组,如:@[@”浙江省”, @”杭州市”, @”西湖区”])
  5. * @param resultBlock 选择后的回调
  6. *
  7. */
  8. + (void)showAddressPickerWithDefaultSelected:(NSArray *)defaultSelectedArr
  9. resultBlock:(BRAddressResultBlock)resultBlock;
  10. /**
  11. * 2.显示地址选择器(支持 设置自动选择 和 自定义主题颜色)
  12. *
  13. * @param defaultSelectedArr 默认选中的值(传数组,如:@[@”浙江省”, @”杭州市”, @”西湖区”])
  14. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  15. * @param themeColor 自定义主题颜色
  16. * @param resultBlock 选择后的回调
  17. *
  18. */
  19. + (void)showAddressPickerWithDefaultSelected:(NSArray *)defaultSelectedArr
  20. isAutoSelect:(BOOL)isAutoSelect
  21. themeColor:(UIColor *)themeColor
  22. resultBlock:(BRAddressResultBlock)resultBlock;
  23. /**
  24. * 3.显示地址选择器(支持 设置选择器类型、设置自动选择、自定义主题颜色、取消选择的回调)
  25. *
  26. * @param showType 地址选择器显示类型
  27. * @param defaultSelectedArr 默认选中的值(传数组,如:@[@”浙江省”, @”杭州市”, @”西湖区”])
  28. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  29. * @param themeColor 自定义主题颜色
  30. * @param resultBlock 选择后的回调
  31. * @param cancelBlock 取消选择的回调
  32. *
  33. */
  34. + (void)showAddressPickerWithShowType:(BRAddressPickerMode)showType
  35. defaultSelected:(NSArray *)defaultSelectedArr
  36. isAutoSelect:(BOOL)isAutoSelect
  37. themeColor:(UIColor *)themeColor
  38. resultBlock:(BRAddressResultBlock)resultBlock
  39. cancelBlock:(BRAddressCancelBlock)cancelBlock;
  40. /**
  41. * 4.显示地址选择器(支持 设置选择器类型、传入地区数据源、设置自动选择、自定义主题颜色、取消选择的回调)
  42. *
  43. * @param showType 地址选择器显示类型
  44. * @param dataSource 地区数据源
  45. * @param defaultSelectedArr 默认选中的值(传数组,如:@[@”浙江省”, @”杭州市”, @”西湖区”])
  46. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  47. * @param themeColor 自定义主题颜色
  48. * @param resultBlock 选择后的回调
  49. * @param cancelBlock 取消选择的回调
  50. *
  51. */
  52. + (void)showAddressPickerWithShowType:(BRAddressPickerMode)showType
  53. dataSource:(NSArray *)dataSource
  54. defaultSelected:(NSArray *)defaultSelectedArr
  55. isAutoSelect:(BOOL)isAutoSelect
  56. themeColor:(UIColor *)themeColor
  57. resultBlock:(BRAddressResultBlock)resultBlock
  58. cancelBlock:(BRAddressCancelBlock)cancelBlock;
  59. 复制代码
  • 使用示例(参考Demo):
  1. // 【转换】:以@” “子字符串为基准将字符串分离成数组,如:@”浙江省 杭州市 西湖区” ——》@[@”浙江省”, @”杭州市”, @”西湖区”]
  2. NSArray *defaultSelArr = [weakSelf.addressTF.text componentsSeparatedByString:@” “];
  3. [BRAddressPickerView showAddressPickerWithShowType:BRAddressPickerModeArea defaultSelected:defaultSelArr isAutoSelect:YES themeColor:nil resultBlock:^(BRProvinceModel *province, BRCityModel *city, BRAreaModel *area) {
  4. weakSelf.addressTF.text = [NSString stringWithFormat:@“%@ %@ %@”, province.name, city.name, area.name];
  5. } cancelBlock:^{
  6. NSLog(@“点击了背景视图或取消按钮”);
  7. }];
  8. 复制代码
  • 地址选择器的3种显示类型(showType 的3个枚举值):
样式1:BRAddressPickerModeProvince 样式2:BRAddressPickerModeCity
样式3:BRAddressPickerModeArea

6.3. 自定义字符串选择器:BRStringPickerView

​ 查看 BRStringPickerView.h 头文件,里面提供了3个方法,可根据自己的需求选择其中的一个方法进行使用。

  1. /**
  2. * 1.显示自定义字符串选择器
  3. *
  4. * @param title 标题
  5. * @param dataSource 数据源(1.直接传数组:NSArray类型;2.可以传plist文件名:NSString类型,带后缀名,plist文件内容要是数组格式)
  6. * @param defaultSelValue 默认选中的行(单列传字符串,多列传一维数组)
  7. * @param resultBlock 选择后的回调
  8. *
  9. */
  10. + (void)showStringPickerWithTitle:(NSString *)title
  11. dataSource:(id)dataSource
  12. defaultSelValue:(id)defaultSelValue
  13. resultBlock:(BRStringResultBlock)resultBlock;
  14. /**
  15. * 2.显示自定义字符串选择器(支持 设置自动选择 和 自定义主题颜色)
  16. *
  17. * @param title 标题
  18. * @param dataSource 数据源(1.直接传数组:NSArray类型;2.可以传plist文件名:NSString类型,带后缀名,plist文件内容要是数组格式)
  19. * @param defaultSelValue 默认选中的行(单列传字符串,多列传一维数组)
  20. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  21. * @param themeColor 自定义主题颜色
  22. * @param resultBlock 选择后的回调
  23. *
  24. */
  25. + (void)showStringPickerWithTitle:(NSString *)title
  26. dataSource:(id)dataSource
  27. defaultSelValue:(id)defaultSelValue
  28. isAutoSelect:(BOOL)isAutoSelect
  29. themeColor:(UIColor *)themeColor
  30. resultBlock:(BRStringResultBlock)resultBlock;
  31. /**
  32. * 3.显示自定义字符串选择器(支持 设置自动选择、自定义主题颜色、取消选择的回调)
  33. *
  34. * @param title 标题
  35. * @param dataSource 数据源(1.直接传数组:NSArray类型;2.可以传plist文件名:NSString类型,带后缀名,plist文件内容要是数组格式)
  36. * @param defaultSelValue 默认选中的行(单列传字符串,多列传一维数组)
  37. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  38. * @param themeColor 自定义主题颜色
  39. * @param resultBlock 选择后的回调
  40. * @param cancelBlock 取消选择的回调
  41. *
  42. */
  43. + (void)showStringPickerWithTitle:(NSString *)title
  44. dataSource:(id)dataSource
  45. defaultSelValue:(id)defaultSelValue
  46. isAutoSelect:(BOOL)isAutoSelect
  47. themeColor:(UIColor *)themeColor
  48. resultBlock:(BRStringResultBlock)resultBlock
  49. cancelBlock:(BRStringCancelBlock)cancelBlock;
  50. 复制代码
  • 使用示例(参考Demo):
  1. // 自定义单列字符串
  2. //NSArray *dataSource = @[@”大专以下”, @”大专”, @”本科”, @”硕士”, @”博士”, @”博士后”];
  3. NSString *dataSource = @“testData1.plist”; // 可以将数据源(上面的数组)放到plist文件中
  4. [BRStringPickerView showStringPickerWithTitle:@“学历” dataSource:dataSource defaultSelValue:weakSelf.educationTF.text isAutoSelect:YES themeColor:nil resultBlock:^(id selectValue) {
  5. weakSelf.educationTF.text = selectValue;
  6. } cancelBlock:^{
  7. NSLog(@“点击了背景视图或取消按钮”);
  8. }];
  9. // 自定义多列字符串
  10. NSArray *dataSource = @[@[@“第1周”, @“第2周”, @“第3周”, @“第4周”, @“第5周”, @“第6周”, @“第7周”], @[@“第1天”, @“第2天”, @“第3天”, @“第4天”, @“第5天”, @“第6天”, @“第7天”]];
  11. //NSString *dataSource = @”testData3.plist”; // 可以将数据源(上面的数组)放到plist文件中
  12. NSArray *defaultSelArr = [weakSelf.otherTF.text componentsSeparatedByString:@“,”];
  13. [BRStringPickerView showStringPickerWithTitle:@“自定义多列字符串” dataSource:dataSource defaultSelValue:defaultSelArr isAutoSelect:YES themeColor:RGB_HEX(0xff7998, 1.0f) resultBlock:^(id selectValue) {
  14. weakSelf.otherTF.text = [NSString stringWithFormat:@“%@,%@”, selectValue[0], selectValue[1]];
  15. } cancelBlock:^{
  16. NSLog(@“点击了背景视图或取消按钮”);
  17. }];
  18. 复制代码
  • 字符串选择器效果图:
单列字符串选择器(默认主题色样式) 双列字符串选择器(自定义主题色样式)
3列字符串选择器(自定义主题色样式) 4列字符串选择器(自定义主题色样式)

7. 许可证

BRPickerView 使用 MIT 许可证,详情见 LICENSE 文件。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速