RxJava之操作符(2)
参考网址
使用过的操作符
concat
连接多个Observables(被观察者)
最多有9个参数,但是可以嵌套,传的数据必须是相同类型mergeDelayError
合并发送
合并两个发送,如果一个出错不马上发送错误,而是延时到都发送完interval
定时循环发送map
数据类型转换(同步)flatmap
传入数据,生成新的Observable,一般处理异步任务,连接能实现concat功能distinct
过滤去重操作符distinct(Func1)
自定义过滤操作符
可以以其中的某个重复项为过滤条件repeat
重复发送
重复订阅retry
错误重试
发送一个错误(onError),重新订阅retryWhen(Func1)
判断错误,根据错误(func1)决定是否重新订阅
发送一个错误(onError),通过func1处理错误,决定是否再次订阅Timeout
超时发送一个onErrorzip
组合zipwith
组合
两个都发送onnext后组合,如果另外一个未发,等待组合后才开始发下一个delay
延时发送
RxJava概念(1)
button点击事件
1 | button.setOnClickListener(new View.OnClickListener() { |
从上面代码理解:
被观察者Observable
—–>button
—–>一些操作,事件,任务(相当于我们不知道button
什么时候被点击)
观察者Observer
/Subscriber
—–>OnClickListener
—–>决定事件触发的时候将有怎样的行为
订阅Subscribe
—–>setOnClickListener
—–>注册事件关联
事件onNext()
/onCompleted()
/onError()
—–>onClick()
—–>回调,最终结果(Subscriber
多了onStart()``unsubscribe()
)
Observable
被观察者
创建被观察者
creat()
最基本的创造事件序列的方法
1 | Observable observable = Observable.create(new Observable.OnSubscribe<String>() { |
just()
快捷创建事件序列
1 | Observable observable = Observable.just("Hello", "Hi", "Aloha"); |
from()
传入的数组或 Iterable 拆分成具体对象后,依次发送出来
1 | String[] words = {"Hello", "Hi", "Aloha"}; |
ActionX
自定义(onCompleted
,onError
,onNext
) 无返回值FuncX
有返回值
1 | Action1<String> onNextAction = new Action1<String>() { |
Scheduler
线程控制(调度器)
Schedulers.immediate()
:直接在当前线程运行,相当于不指定线程。这是默认的Scheduler
。Schedulers.newThread()
:总是启用新线程,并在新线程执行操作。Schedulers.io()
: I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。Schedulers.computation()
:计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。AndroidSchedulers.mainThread()
:指定的操作将在 Android 主线程运行。
1 | Observable.just(1, 2, 3, 4) |
变换
map()
flatMap()
android之文本转语音
android 系统自带了文本转语音的功能
一般手机都有Pico TTS功能,但是没有中文语言包
解决方案: 安装google 语音装文本tts服务或者讯飞tts等兼容系统接口的TTs
文字转语音的代码比较少
1 | TextToSpeech mTts; |
注意销毁 TextToSpeech
1 | @Override |
问题
在使用nubia手机时,发现手机没有这项(TTs)设置,安装了其它TTs却不能开启。
解决:打算用第三方sdk,但是查了一下讯飞的离线文字转语音却发现是收费的,只能说nubia的系统太坑了。
GooleMap之自动缩放以显示所有标记
官方描述
设置边界
有时,通过移动摄像头来以尽可能最高的缩放级别显示整个受关注区域很有用处。 例如, 如果您要显示用户当前位置方圆五英里内的所有加油站, 可能就需要通过移动摄像头让它们全都显示在屏幕上。 如需实现此目的,请先计算您想在屏幕上显示的 LatLngBounds。 然后使用 CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding) 获取 CameraUpdate,后者会相应更改摄像头位置,使得给定 LatLngBounds 在计入所指定内边距(单位:像素)后能够完全容纳在地图内。 返回的 CameraUpdate 可确保给定边界与地图边缘之间的间隙(单位:像素)至少与指定的内边距一样大。 请注意,地图的倾斜角度和方位均为 0。
1 | private GoogleMap mMap; |
LatLngBounds
- public LatLngBounds including (LatLng point) 包含显示的点
- public LatLng getCenter () 获得中心点
代码的具体实现
1 | LatLngBounds.Builder latLngBounds=new LatLngBounds.Builder(); |
问题
如果直接在获取到地图后调用会报错
解决:在回调里调用
1 | googleMap.setOnMapLoadedCallback(this); |
greenDAO3.1框架(四)添加全局初始化及基本使用
全局初始化greenDAO设置
1 | public class UserGlobalApp extends Application{ |
使用
添加数据,查询数据
1 | UserGlobalApp.getApplication().getDaoSession().getTrackPointDao().insert(new TrackPoint((long) 10,System.currentTimeMillis(),10.01,10.02,1)); |
生成的dao目录配置(非必须)
1 | //------------greenDAO数据库配置----------- |
问题
数据库加密问题
在全局配置中如果要加密,要设置为true,但是设置为ture会报错
1 | public static final boolean ENCRYPTED = false; //改为true需要加入包compile |
解决:因为没有加密包,需要添加依赖
1 | compile 'net.zetetic:android-database-sqlcipher:3.5.1' |
数据库路径设置
1 | File path=new File(Environment.getExternalStorageDirectory(),"BleDemo/db/"+dbName); //设置存储路径 |
android自定义标题栏Toolbar
新建一个xml,放标题内容
1 | <?xml version="1.0" encoding="utf-8"?> |
在需要的页面调用
1 | <include |
去掉自带标题
在配置文件找到
1 | android:theme="@style/AppTheme" |
点击进去把parent修改为NoActionBar
1 | <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> |
在activity里获取标题控件,设置基本属性
1 | toolbar = (Toolbar) findViewById(R.id.toolbar); |
在activity添加标题栏返回箭头
使能返回button
1 | toolbar = (Toolbar) findViewById(R.id.toolbar); |
添加返回button事件
1 | @Override |
Ble蓝牙开发之五扫描与连接速度优化
扫描模式
ScanSettings的属性与方法
1 | ScanSettings settings = new ScanSettings.Builder() |
greenDAO3.1框架(一)认识
主流的ORM框架
- LitePal
- AFinal
- greenDAO
区别与性能分析
greenDAO
介绍
greenDAO是一种Android数据库ORM(object/relational mapping)框架,与OrmLite、ActiveOrm、LitePal等数据库相比,单位时间内可以插入、更新和查询更多的数据,而且提供了大量的灵活通用接口。
源码github
官网
GreenDao 3.0改动:
使用过GreenDao的同学都知道,3.0之前需要通过新建GreenDaoGenerator工程生成Java数据对象(实体)和DAO对象,非常的繁琐而且也加大了使用成本。
GreenDao 3.0最大的变化就是采用注解的方式通过编译方式生成Java数据对象和DAO对象。