消息通讯
2019-01-28 09:30:59 0 举报
消息
作者其他创作
大纲/内容
Gif动图
静态变量和全局变量都可以采用static的方式来定义,如果采用这种方式还是推荐用一个专门的类结合单体模式进行管理,尽量减少对内存的消耗。
将ImageView调整成不同大小不管大小如何设置。Picasso只缓存一个全尺寸的。Glide则不同,它会为每种大小的ImageView缓存一次
Service和Thread的区别
Android 获取外置SD卡
全局变量
使用
发布消息时使用sendMessage方法进行发布
内部存储没有root的手机不能打开该文件夹的
不可以加载动图
作用
context.getExternalCacheDir()获取路径:/storage/emulated/0/Android/data/应用包名/cache应用程序特定目录的绝对路径,与 mContext.getCacheDir() 相似,区别在于平台并不总是监视共享存储中可用的空间,因此可能不会自动删除这些文件。这些文件是应用程序内部的,通常不作为媒体文件对用户展示。 !
IntentService
Thread
Retrofit是square开源的网络Restful请求框架,底层是基于okhttp的
常用(外部存储)
Glide
消息通信
Glide默认的是Bitmap格式是RGB-565
Glide.with(this) .load(“http://nuuneoi.com/uploads/source/playstore/cover.jpg“) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(ivImgGlide);
功能
DIRECTORY_MUSIC Music 目录中的任何音频文件应该放在常规的音乐列表中供用户使用。DIRECTORY_PODCASTS Podcasts 可放置任何音频文件,应该在用户可以选择的播客列表中(而不是常规音乐)。DIRECTORY_RINGTONES Ringtones 可放置任何音频文件,应该在用户可以选择的铃声列表中(而不是常规音乐)。DIRECTORY_ALARMS Alarms 可放置任何音频文件,应该在用户可以选择的闹铃列表中(而不是常规音乐)。DIRECTORY_NOTIFICATIONS Notifications 可放置任何音频文件,应该在用户可以选择的通知提醒列表中(而不是常规音乐)。DIRECTORY_PICTURES Pictures 其中放置可供用户使用的图片文件。DIRECTORY_MOVIES Movies 其中放置可供用户使用的视频文件。DIRECTORY_DOWNLOADS Download 其中放置用户的下载文件DIRECTORY_DCIM DCIM 传统的安装图片和视频的位置。DIRECTORY_DOCUMENTS Documents 其中放置由用户创建的文档。
优点
可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService、Context.unbindService来控制它,也可以在 Service 里注册 BroadcastReceiver,通过发送 broadcast 来达到控制的目的
Andorid组件
Volley是Google官方出的一套小而巧的异步请求库,该框架封装的扩展性很强, 甚至支持OkHttp,而且Volley里面也封装了ImageLoader,所以如果你愿意你甚至不需要使用图片加载框架,不过这块功能没有一些专门的图片加载框架强大,对于简单的需求可以使用,稍复杂点的需求还是需要用到专门的图片加载框架。Volley也有缺陷,比如不支持post大数据,所以不适合上传文件。不过Volley设计的初衷本身也就是为频繁的、数据量小的网络请求而生。
File
context.getObbDir()获取路径:/storage/emulated/0/Android/obb/应用包名 返回到应用程序特定目录的绝对路径。可能返回NULL。不需要额外权限。
一般Handler的使用方法即在调用线程内创建Handler的内部类(不能是子线程)
拥有Interceptors轻松处理请求与响应(自动处理GZip压缩)
Volley
让Glide既缓存全尺寸又缓存其他尺寸的方法:
// 发送消息SharedPreferences.Editor editor = MainActivity.this.getSharedPreferences(\"SEND\
磁盘缓存
Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上
Android系统剪切板
缺点
Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。
Environment.getDataDirectory() : /data
加载图片(内部会图片大小自动压缩)
Image质量
文件的上传下载
Service
具备Service和Thread功能
Looper.prepare();(主线程会默认创建 Looper ,子线程不会所有要手动创建)new Handler();Looper.loop();
handler一般用于线程间通信,它可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)
使用简单,快速且轻量,可以组件、线程间的相互通信
<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>try { File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + \"/data/temp.txt\"); FileOutputStream out = new FileOutputStream(file); out.write(\"message\".getBytes(Charset.forName(\"UTF-8\"))); out.flush(); out.close();} catch (IOException e) { e.printStackTrace();}
EventBus.getDefault().post(Object);
Environment.getDownloadCacheDirectory() : /cache
Broadcast
重写handlerMessage(Message msg) 方法
context.getCacheDir()获取路径:/data/user/0/应用包名/cache应用程序缓存文件的目录的路径。强烈鼓励应用程序将缓存空间的使用保持在满额。当该文件夹超额时,系统将自动删除该目录中的文件为其他地方提供需要空间,当不满额时则不会。不需要额外的权限来读取或在返回的路径下写入文件。
支持请求回调,直接返回对象、对象集合
Intent
子线程使用 Handler
此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以 View 注解,使用这种框架很方便,这样会使得整个项目对它依赖性太强,万一以后这个库不维护了,或者中间某个模块出问题了,这个影响非常大
加载同一张图片Picasso,Picasso的内存开销仍然远大于Glide。
在EventBus中事件的分发是通过注解函数的参数类型确定的,因此在事件发布遭到大量滥用时,特别有多个订阅者、多个相同参数时,很难从事件发布者开始理清消息流,无法快速的找出是哪个订阅者接受并处理了消息导致的问题,这就要求了参与者必须对整个通知过程有着良好的理解。当程序代码适量时,这是一个合理的要求,然而当程序太大时,这将成为一种负担。在EventBus中一定要写好必要的注释信息,否则在后续工作交接中会产生很多不必要的麻烦。
<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>try { FileInputStream in = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + \"/temp.txt\"); byte[] reader = new byte[256]; int read = in.read(reader); String content = \"\
Retrofit
网络请求(常用Retrofit)
(1)Glide比Picasso加载速度快,但Glide比Picasso需要更大的空间来缓存;(2)Glide加载图像及磁盘缓存的方式都优于Picasso,且Glide更有利于减少OutOfMemoryError的发生;(3)Glide可以加载Gif动图,Picasso不可以加载动图(4)Picasso加载的图片比Glide加载的图片平滑(可忽略不计)
SD卡:这里的SD卡是指内置的SD卡
静态变量
读取
xutils
EventBus
Environment.getExternalStorageState() 获取存储状态
Environment类
Hander内部类和其定义类是绑定的,这就造成了事件发布者和接受者之间的高耦合
各种消息传递和通信进行一个对比,Intent的方法是不太适合大量的数据传递的,如果大于0.5M会抛出异常。而才用静态变量或者全局变量则占用内存较大,且不易管理。系统剪切板的很少见,以为容易丢失数据。本地化的存储方式需要较多的时间,但是这种方式存储的数据是持久化的,可以用于故障恢复等场景,不过就是需要考虑IO的时间。使用Androdi组件的Broadcast或者service在小数据传输时例如仅仅是Activity跳转传输一两个变量,就未免太大才小用了。EventBus是基于事件订阅和发布的,使用上很方便。根据应用场景合理选择。
EventBus.getDefault().register(this);
type
context.getExternalFilesDir(String type)获取路径:/storage/emulated/0/Android/data/应用包名/files/type指定目录(详见下面Environment分析)应用程序特定目录的绝对路径,与 mContext.getFilesDir() 相似。这些文件是应用程序内部的,通常不作为媒体文件对用户展示。
由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。
Thread 是程序执行的最小单元,可以用 Thread 来执行一些异步的操作。
调度灵活。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。父类对于通知的监听和处理可以继承给子类,这对于简化代码至关重要;通知的优先级,能够保证 Subscriber 关注最重要的通知;粘滞事件(sticky events)能够保证通知不会因 Subscriber 的不在场而忽略。可继承、优先级、粘滞,是 EventBus 比之于广播、观察者等方式最大的优点,它们使得创建结构良好组织紧密的通知系统成为可能
路径
内存
SQLite
复杂数据储存,卸载app之后会随之删除(升级数据库需手动复制数据到新版数据库)
能直接执行耗时操作
Picasso
基于Headers的缓存策略减少重复的网络请求。
子线程
安排一个动作在不同的线程中执行。
MEDIA_UNKNOWN 未知的存储状态,例如路径没有由已知存储媒体支持时。MEDIA_REMOVED 存储媒体被移除MEDIA_UNMOUNTED 存储媒体没有挂载MEDIA_CHECKING 存储状态(如果媒体存在并正在检查磁盘)。MEDIA_NOFS 空白或是不支持的文件系统MEDIA_MOUNTED 存储媒体已经挂载,并且可读/写MEDIA_MOUNTED_READ_ONLY 存储媒体已经挂载,只读。MEDIA_SHARED 存储媒体正在通过USB共享MEDIA_BAD_REMOVAL 在没有挂载前存储媒体已经被移除MEDIA_UNMOUNTABLE 存储媒体无法挂载MEDIA_EJECTING 存储媒体处于被弹出的过程
基本不用
context获取路径
context.getCodeCacheDir()获取路径:/data/user/0/应用包名/code_cache保存应用程序代码缓存文件的目录路径。适合在运行时存放应用产生的编译或者优化的代码。不需要额外权限。需要判断Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP(21)。
Picasso默认ARGB_8888格式
写入
公有目录
本地化存储方式
安排消息或Runnable 在某个主线程中某个地方执行;
获取存储状态
支持session的保持
支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)
私有目录 最常用(卸载app后自动删除)
不能直接执行耗时操作
Intent intent = new Intent();intent.putExtra(\"send\
启动Activity、service、发送广播等常用
可以加载Gif动图
而Handler的最大好处是发生问题时,可以非常明确、快速的进行定位,通过msg.what很容易就可以理清每一条消息流的逻辑。
SharedPreference
Environment.getRootDirectory(): /system
context.getFilesDir()获取路径:/data/user/0/应用包名/files包含应用程序文件的目录的路径。不需要额外的权限来读取或在返回的路径下写入文件。
PUT,DELETE,POST,GET等请求
常用
EventBus.getDefault().unregister(this);
图片加载(常用Glide)
Thread 的运行是独立的,也就是说当一个 Activity 被 finish 之后,如果没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,不再持有该 Thread 的引用,也就是不能再控制该Thread。另一方面,没有办法在不同的 Activity 中对同一 Thread 进行控制。
Looper 让该线程一直在运行,从而通过消息循环机制获取从其他线程发来的消息,传给 Handler 来处理。
Handler
Environment.getExternalStoragePublicDirectory(DIRECTORY_ALARMS)/storage/sdcard0/AlarmsEnvironment.getExternalStoragePublicDirectory(DIRECTORY_DCIM)/storage/sdcard0/DCIMEnvironment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS)/storage/sdcard0/DownloadEnvironment.getExternalStoragePublicDirectory(DIRECTORY_MOVIES)/storage/sdcard0/MoviesEnvironment.getExternalStoragePublicDirectory(DIRECTORY_MUSIC)/storage/sdcard0/MusicEnvironment.getExternalStoragePublicDirectory(DIRECTORY_NOTIFICATIONS)/storage/sdcard0/NotificationsEnvironment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES)/storage/sdcard0/PicturesEnvironment.getExternalStoragePublicDirectory(DIRECTORY_PODCASTS)/storage/sdcard0/PodcastsEnvironment.getExternalStoragePublicDirectory(DIRECTORY_RINGTONES)/storage/sdcard0/Ringtones
context.getNoBackupFilesDir()获取路径:/data/user/0/应用包名/no_backup不会自动备份到远程存储的应用程序文件的路径。需要判断Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP(21)。
Environment.getExternalStorageDirectory(): 返回路径:/storage/emulated/0
Picasso缓存的是全尺寸的。而Glide缓存的跟ImageView尺寸相同
所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。
可以指定事件处理方法的执行线程,和订阅者的优先级(跟广播类似)
轻量级储存(key value),卸载app之后会随之删除
主线程
简化Andorid、Fragment、Threads、Service之间信息传递的一个发布/订阅事件集
OkHttp
@Subscribe
0 条评论
下一页