![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
安卓
文章平均质量分 57
魔幻音
如果世界上真的有奇迹,那只是努力的另一个代名词。
展开
-
Rxjava:实现原理浅析
onNext的实现如上,若没有disposed(关闭连接),就执行onNext。(此处在create内只是定义好方法,并没有真正执行,只有subscribe触发subscribeActual,该方法里面调用了。这里就发现subscribe会调用内部的subscribeActual,就会再调用被观察者实现的subscribe方法,其中的onNext等内容就会被调用。Observer本身就是一个接口,里面四个方法响应被观察者的不同事件。,传入的相当于事件发出的source。就是真正执行这些定义好的方法)原创 2022-09-03 02:28:25 · 750 阅读 · 1 评论 -
Rxjava:基础入门
Rxjava基于事件流、实现异步操作。采用Observer接口实现Log . d("main" , "开始采用subscribe连接");Log . d("main" , "对Error事件作出响应");} };原创 2022-08-29 20:36:17 · 716 阅读 · 0 评论 -
安卓跨进程通信:Messenger、AIDL远程Service 使用
①intent设置隐式必须声明package为service所在包名(而action不必声明,但若声明则必须和服务端设置的action相同,否则service绑定失败)a、客户端与服务端通过service绑定成功后,调用ServiceConnection回调方法,客户端依据返回的binder生成给服务端发送信息的messenger。在Service中创建Messenger实例,通过Message消息机制进行操作,Service的onBind中返回messenger实例的Binder对象。...原创 2022-07-18 17:18:09 · 467 阅读 · 0 评论 -
安卓异步通信:Handler源码分析
Handler:sendMessage/post:将消息发送到消息队列中dispatchMessage:将消息分发给对应HandlerhandleMessage:依据消息进行相关处理/操作MessageQueue:enqueueMessage:将消息依据时间放入消息队列(入队)next:从消息队列取出消息(出队)Looper:prepare:创建一个循环器+消息队列实例loop:消息循环(即从消息队列取出消息并发给Handler)依旧采用由使用步骤深入分析实际调用:创建Handler对象的过原创 2022-07-12 17:03:44 · 259 阅读 · 0 评论 -
安卓跨进程通信:Binder解析
从机制、模型角度分析:Binder是一种安卓中实现跨进程通信(IPC)的方式(即Binder机制模型)作用:在安卓中实现跨进程通信从模型的结构、组成来说:Binder是一种虚拟的物理设备驱动(即Binder驱动)作用:连接Service进程、Client进程和ServiceManager进程从安卓代码实现角度来说:Binder是一个类,实现了IBinder接口(即Binder类)作用:将Binder机制模型以代码的形式具体体现在安卓中一个进程空间分为用户空间、内核空间用户空间:进程间,用户空间原创 2022-07-11 16:05:53 · 716 阅读 · 0 评论 -
安卓异步通信:Handler基础使用及其工作原理
安卓信息传递机制/异步通信机制作用 在多线程应用场景,将工作线程中需要更新UI的操作信息传递到UI主线程从而实现信息异步通信。特点 为保证线程安全,使用Handler主线程 应用程序第一次启动同时开启的主线程;负责处理UI相关事件子线程 后续人为手动开启的线程;负责进行耗时操作消息 线程间通信的数据单元;负责存储通信信息消息队列 队列数据结构;存储Handler发来的消息处理者 主线程与子线程的通信媒介,线程消息的主要处理者;负责添加消息到消息队列、处理循环器分派过来的消息循环器 消息队列与处理原创 2022-07-11 16:05:04 · 553 阅读 · 0 评论 -
安卓基础知识:Intent解析
用于描述应用的动作及其对应数据①指定当前组件需要做的动作②在不同组件之间传递数据(Activity、Service、BroadcastReceiver)显式意图在intent初始化时直接显式传入所需数据隐式意图通过action、category、data匹配隐式获取到AndroidManifest中设置好的内容具体使用在Activity分析中用到putExtra()、Bundle①8大基本数据类型②Intent、Bundle③Serializable对象、Parcelable对象、CharSe原创 2022-07-06 11:41:15 · 685 阅读 · 0 评论 -
安卓基础知识:Context解析
Activity本身继承了Context抽象类,可以通过Context获取一些相关信息获取应用相关信息获取系统/应用资源四大组件交互文件相关数据库相关不同类型ActivityContext:与UI相关,对UI资源进行操作ApplicationContext:生命周期较长(ApplicaitonContext生命周期与应用保持一致,注意内存泄漏)Activity继承ContextThemeWrapper来间接继承ContextWrapper,而Service与Applicaiton直接继承Co原创 2022-07-06 11:20:19 · 247 阅读 · 0 评论 -
安卓四大组件:ContentProvider
跨进程通信,进程间进行数据交互/共享底层采用Binder机制作为数据操作的中间者(搬运工)系统预置URI自定义URI自定义URI格式:content(主题): //com.lms.xiyou(授权信息)/word(表名)/1(记录)主题:URI前缀授权信息:ContentProvider唯一标识符表名:指向数据库某个表的名称记录:表中某个记录例如:指向com.lms.xiyou的ContentProvider中表名为User中id为1的数据表示匹配provider的所有内容(可以使用通配符原创 2022-07-04 17:17:52 · 363 阅读 · 0 评论 -
安卓四大组件:Service
提供后台长期运行的服务(复杂计算、音乐播放、下载等)本地服务LocalService:运行在主线程,主线程结束,服务也结束因为运行在主线程,通信方便远程服务RemoteService:运行在独立进程,服务常驻后台,不受Activity影响前台服务:在通知栏显示通知(用户可看到)服务时,需要用户知道并进行相关操作(服务终止时,通知栏通知也会消失)后台服务:后台(用户无法看到)类似天气、时间更新等,无需用户知道或操作的任务不可通信的后台服务:用startService()启动,调用者退出后ser原创 2022-07-03 17:23:57 · 696 阅读 · 0 评论 -
安卓四大组件:BroadCastReceiver
采用观察者模式:基于消息的发布/订阅事件模型分为三个角色:①消息订阅者(广播接收者)②消息发布者(广播发布者)③消息中心基本流程: ①广播接收者 在 消息中心 进行注册②广播发布者 先向 消息中心 发送广播③消息中心 依据 广播发布者 要求筛选 接收者④消息中心 将广播发送到合适 接收者 的消息队列中⑤广播接收者 通过消息循环拿到广播,调用onReceive要求: ①继承BroadcastReceiver基类②必须复写抽象方法onReceive()注:onReceive中不应执行耗时操作(广播原创 2022-07-03 16:11:28 · 492 阅读 · 0 评论 -
安卓四大组件:Activity
onCreate Activity开始创建onStart Activity正在被启动(上述两步进行初始化工作)onResume ①第一次启动完毕②失去焦点重新返回Activity时(数据恢复+展示)onPause 失去焦点、Activity停止时(数据存储、动画停止、注销广播)onStop Activity彻底被挡住(回收、资源释放)onRestart 在stop后重新完全显示(数据恢复)onDestory Activity被销毁(回收、资源释放)每次启动Activity都会新创建一个Activ原创 2022-07-03 11:41:06 · 499 阅读 · 0 评论 -
Android开源库:FileDownloader使用流程
全局初始化在Applicaiton的onCreate中进行初始化,调用对应FileDownloader.setupOnApplicationOnCreate(application)(需要自定义属性)或FileDownloader.setup(Context)即可。获取下载实例后,传入下载所用url路径,下载到的本地路径path,设置好下载监听器(下载完成、错误时的反馈),直接start启动即可。①定义监听器和上述单任务相同,需要创建好监听器②创建下载任务队列创建时需要传入创建好的监听器③创建任务路原创 2022-06-25 17:26:15 · 2086 阅读 · 0 评论 -
Retrofit2基础使用与解析:从使用步骤深入分析源码
联网权限:步骤二 创建接收数据实体类依据服务器返回的数据,建造实体类承载数据使用注解进行请求方式、参数的设置。方法的返回值默认使用Call。(使用RxJava时用Observable)步骤五 创建网络请求接口实例调用retrofit.create方法获取请求接口的实体类,调用该实体类方法即可对请求进行封装。使用生成的call,分别调用enqueue、execute进行异步、同步请求。使用数据response进行数据处理。可以看出实例是使用建造者模式创建的,由用户...原创 2022-06-15 17:05:55 · 628 阅读 · 0 评论 -
Lottie简单使用
导入依赖implementation "com.airbnb.android:lottie:3.6.0"资源拷贝将json和images文件夹拷贝到assets目录下布局中添加Lottie控件<com.airbnb.lottie.LottieAnimationView android:id="@+id/lott8" android:layout_width="87dp" android:layout_height="88dp" android:scaleT原创 2022-05-09 23:27:53 · 440 阅读 · 0 评论 -
自定义View、ViewGroup浅析
自定义View过程自定义View关键点:onMeasure()、onDraw()onMeasure该函数目的是测量View宽高属性,虽然在xml中制定了View宽高,但当设置为wrap_content或match_parent时,此处获取宽高就需要由onMeasure()处理。举例:实现一个宽采用match_parent,而高为100dp的正方形。在不重写方法情况下,上述长宽通常是不同的,所以就需要在测量函数中调整长宽长度。 private int getMySize(int defaultS原创 2022-05-09 17:26:48 · 200 阅读 · 0 评论 -
JWT简介与使用(安卓注意事项)
JWT简介token进行用户身份验证流程:①客户端使用用户名+密码请求登录②服务端收到请求验证用户名和密码③验证成功后,服务端发送一个token给客户端④客户端将token保存起来⑤后续请求资源需要携带这个token⑥服务端进行token验证,验证成功则执行请求token相比于session优点:①节约服务器资源,对移动端友好②支持跨域访问(跨域名访问):cookie无法跨域,而token放到请求头中可不使用cookie,故跨域后不存在信息丢失问题(即发送token不是针对某个域名单独进原创 2022-05-07 17:04:06 · 1653 阅读 · 2 评论 -
安卓跨进程通信
为什么需要多进程①安卓系统给单个应用可以使用的最大内存做了限制,当app想要突破限制时,需要多进程获取更多内存空间。②一些特殊模块需要不影响主模块的稳定性、不占用主模块的内存,并且需要与主业务生命周期剥离。③app保活,一些app在后台为了不被系统杀掉,可以用多线程方式进行app拉活。多进程问题①Application多次重建②静态成员变量和单例模式失效:系统给每个进程分配独立虚拟机,导致单例等会有多个副本③线程同步机制失效:因为基于多进程,不同进程的锁对象都不同④SharedPrefere原创 2022-04-11 17:02:35 · 720 阅读 · 1 评论 -
安卓多线程实现方式
Thread继承Thread类,重写run方法特点:生成的各个线程相互独立,但占据了单继承类Runnable实现Runnable接口,创新线程,将任务传入特点:各个线程合作完成任务,共享资源(即多个线程完成一个任务)Handler常用与工作线程将更新UI操作传送到UI主线程相关概念:①消息Message:线程间通讯的数据单元②消息队列Message Queue:存储发送来的消息挨个处理③循环器Looper:消息队列和处理者的通信媒介,循环进行消息获取(从队列取数据)、消息分发(将取到的原创 2022-04-05 16:05:10 · 2165 阅读 · 0 评论 -
安卓数据存储的5种方式
SharedPreferences:①使用键值对的方式进行数据存储(以xml文件形式存储到手机中)②常用与保存用户设置,如CheckBox选择状态、配置信息等注:①commit发生在UI主线程,apply发生在工作线程,线程可能不安全②key和value不应太大文件存储:直接将所需要保存的内容写到手机文件中手机内部、外部存储选择:①数据私有->内部存储②数据不大+访问频繁->内部存储③数据较大->外部存储④数据随应用卸载而删除->storage/sdcard/原创 2022-04-04 22:47:32 · 5598 阅读 · 0 评论 -
安卓图片大小优化及三级缓存
图片大小优化图片大小=一个像素点大小 × 像素个数那么大小优化有两个角度:①减小像素点大小②减少像素点个数安卓自带参数:a.inPreferredConfig:设置解码后像素格式如:①A(透明度)RGB(三原色)_8888此模式下总共需要4*8=32位即4字节②RGB_565:此模式下需要5+6+5=16=2字节所以将像素格式调整后可以优化大小。b.inSampleSize:设置图片采样率进行缩放显示(需要值是2的幂次方)如:传入参数为2,则加载图片宽高是1/2,大小也就是原图的原创 2022-04-03 22:41:01 · 362 阅读 · 0 评论 -
Activity和Fragment区别、联系
①生命周期:生命周期描述Activity:OnCreate()->OnStart()->OnResume->OnPause()->OnStop()->OnDestory()Fragment:OnAttach()->OnCreate()->OnCreateView()->OnActivityCreate()->OnStart()->OnResume()->OnPause()->OnStop()->OnDestoryView原创 2022-04-03 21:23:48 · 2780 阅读 · 0 评论 -
Activity与Fragment生命周期
Activity:刚开始创建:OnCreate()创建后(还不可见):OnStart()第一次启动完毕/失去焦点重新返回:OnResume()至此Activity初始化完毕失去焦点:OnPause()不可见时:OnStop()不可见状态恢复到UI最顶层时:OnRestart()销毁:OnDestory()Fragment:第一步与Activity建立关联:OnAttach()开始创建:OnCreate()加载布局(当从Fragment管理栈回来时会从此继续向下走):OnCreateV原创 2022-03-23 23:17:50 · 973 阅读 · 0 评论 -
retrofit上传、下载文件
上传文件:接口方法: @POST("post") @Multipart Call<ResponseBody> upload(@Part MultipartBody.Part file);具体使用:Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build(); UploadService uploadService = retrofit.creat原创 2021-08-16 20:03:32 · 696 阅读 · 0 评论 -
retrofit嵌套请求、适配器
嵌套请求:即用户想要获取收藏的文章,就要先登录、再获取。在代码实现就是先进行login登陆,成功后再获取对应信息。而这种重复逻辑代码很麻烦,可以用retrofit的适配器进行设置。依赖添加: implementation("com.squareup.retrofit2:adapter-rxjava3:2.9.0") implementation("io.reactivex.rxjava3:rxandroid:3.0.0")接口方法:@POST("user/login")原创 2021-08-16 19:39:48 · 297 阅读 · 0 评论 -
retrofit转换器使用:即自动gson转换
不用转换器获取实例:接口方法:@POST("user/login") @FormUrlEncoded public Call<ResponseBody> login(@Field("username") String username, @Field("password") String password);Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.wanandroid.com/").b原创 2021-08-16 18:55:03 · 1442 阅读 · 0 评论 -
retrofit基本使用
配置:在app的build.gradle中添加依赖:implementation("com.squareup.retrofit2:retrofit:2.9.0")因为retrofit本身是okhttp的封装,所以导入retrofit内部也导入了okhttp接口创建:public interface HttpbinService { @POST("post") @FormUrlEncoded Call<ResponseBody> post(@Field("us原创 2021-08-16 11:31:07 · 259 阅读 · 0 评论 -
okhttp自定义配置:拦截器、缓存、cookie
拦截器:可以再数据递交前后进行拦截。@Test public void intercepter() { OkHttpClient okHttpClient = new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() { @NotNull @Override public Response intercept(@NotNull Cha原创 2021-08-16 11:01:11 · 544 阅读 · 0 评论 -
基于Okhttp进行文件、json数据的上传测试
文件上传:@Test public void upLoadTest() { OkHttpClient okHttpClient = new OkHttpClient(); File file1 = new File("D:\\desktop\\1.txt"); File file2 = new File("D:\\desktop\\2.txt"); MultipartBody multipartBody = new Multipart原创 2021-08-15 20:03:35 · 353 阅读 · 0 评论 -
OkHttp同步异步请求(get请求、post请求)
首先要想在安卓中使用okhttp先进行配置。①在app的build.gradle中添加依赖: implementation("com.squareup.okhttp3:okhttp:4.9.0")②在AndroidManifest.xml中添加联网权限: <uses-permission android:name="android.permission.INTERNET"/>get同步: okHttpClient = new OkHttpClient()原创 2021-08-15 19:43:02 · 3073 阅读 · 1 评论 -
安卓拖拽总结(直接ontouch事件判断、DragViewHelper布局)
控件拖拽实现方式:①根据控件的touch事件进行位置修改②用ViewDragHelper做自定义控件①介绍:@Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN:// 获取手指第一次接触屏幕 sx = (i原创 2021-08-15 16:23:00 · 664 阅读 · 0 评论 -
安卓kotlin配置
首先进行gradle配置:app gradle:plugins { id 'com.android.application'}apply plugin: 'kotlin-android'apply plugin: 'kotlin-android-extensions'dependencies中添加: implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.32"项目的gradle:dependencies原创 2021-08-05 16:24:42 · 1253 阅读 · 0 评论