Android/Java每日积累[2/27-3/3]

2017/2/27

instanceof的使用

instanceof的使用

vector

  • app:srcCompat 去指向矢量图片资源(正如其他的drawable资源可以用 android:src 引用一样):
    • 矢量图伴随动画
      • *
    <animated-vector 
                 xmlns:android="http://schemas.android.com/apk/res/android"
                 android:drawable="@drawable/square">
    <target
        android:name="square"
        android:animation="@animator/anim_square_color"/>
</animated-vector>
  * 图像布局:`<vector...> <path /> </vector>`
  * 动画布局:`<set...> <objectAnimator /> <set/>` 

2017/2/28

泛型

泛型

final与static

final

  • 有“这是无法改变的”或者“终态的”含义,可以修饰非抽象类、非抽象类成员方法和变量
    • final类不能被继承,没有子类,final类中的方法默认是final的。
    • final方法不能被子类的方法覆盖,但可以被继承。
    • final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
    • final不能用于修饰构造方法。
    • final参数 你可以读取该参数 但是无法改变该参数的值
    • 注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

static

  • 表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
    • 被static修饰的成员变量和成员方法独立于该类的任何对象
    • 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
    • static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
    • static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
      类名.静态方法名(参数列表…)
      类名.静态变量名
    • 用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块,每个代码块只会被执行一次

static和final

  • static final用来修饰成员变量和成员方法,可简单理解为“全局常量”
    • 对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
    • 对于方法,表示不可覆盖,并且可以通过类名直接访问。

newInstance与new

  • 相同点:都可以创建一个类的实例
  • 不同点:
    • newInstance 只能调用无参构造函数
    • new 能调用任何public构造

2017/3/1

RxJava操作符

map的使用

  • map(Func1<? super T,? extends R> func)
  • map
有些服务端的接口设计,会在返回的数据外层包裹一些额外信息,这些信息对于调试很有用,但本地显示是用不到的。使用 map() 可以把外层的格式剥掉,只留下本地会用到的核心格式。代码大致形式:api.getData()
.map(response ->response.data)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);

当然,map() 也可以用于基于其他各种需求的格式转换
  • api 为 json解析完成后为
{
error: false,
results: [{...},{...}]
}
     public class GankBeautyResult {
     public boolean error;
     public @SerializedName("results") List<GankBeauty> beauties;
     }

     一个result 是下面这样的

     _id: "58a24ce0421aa901ef40579f",
     createdAt: "2017-02-14T08:18:40.781Z",
     desc: "2-14",
     publishedAt: "2017-02-14T11:42:37.303Z",
     source: "chrome",
     type: "福利",
     url: "http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-14-16123260_755771577930478_8918176595718438912_n.jpg",
     used: true,
     who: "daimajia"

public class GankBeauty {
    public String createdAt;
    public String url;
}

public class Item {
    public String description;
    public String imageUrl;
}


     将GankBeautyResult.beauties 中 这些数据 GankBeauty 提取 createdAt 和 url 到 Item 中

     完成了GankBeautyResult  ==》 List<Item> 的转换 实现Func1是有返回值方法
     返回 items

zip的使用

  • zip(java.lang.Iterable<? extends Observable<?>> ws,FuncN<? extends R> zipFunction)
  • zip
有的时候,app 中会需要同时访问不同接口,然后将结果糅合后转为统一的格式后输出(例如将第三方广告 API 的广告夹杂进自家平台返回的数据 List 中)。这种并行的异步处理比较麻烦,不过用了 zip() 之后就会简单得多。代码大致形式:
Observable.zip(api.getData(),
adApi.getAds(),zipFunc())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
  • 代码例子

FlatMap

  • flatMap(Func1<? super T,? extends Observable<? extends R>> func)
  • flatmap
出于安全性、性能等方面的考虑,多数服务器会有一些接口需要传入 token 才能正确返回结果,而 token 是需要从另一个接口获取的,这就需要使用两步连续的请求才能获取数据(①token -> ②目标数据)。使用 flatMap() 可以用较为清晰的代码实现这种连续请求,避免 Callback 嵌套的结构。代码大致形式:api.getToken()
.flatMap(token ->api.getData(token))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);

flatmap

RetryWhen

  • retryWhen(Func1<? super Observable<? extends java.lang.Throwable> , ? extends Observable<?>> notificationHandler)
  • retrywhen
有的 token 并非一次性的,而是可以多次使用,直到它超时或被销毁(多数 token 都是这样的)。这样的 token 处理起来比较麻烦:需要把它保存起来,并且在发现它失效的时候要能够自动重新获取新的 token 并继续访问之前由于 token 失效而失败的请求。如果项目中有多处的接口请求都需要这样的自动修复机制,使用传统的 Callback 形式需要写出非常复杂的代码。而使用 RxJava ,可以用 retryWhen() 来轻松地处理这样的问题。代码大致形式:api.getData(token)
.retryWhen(observable ->
observable.flatMap( ->
api.getToken()
.doOnNext(->updateToken())))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
  • retrywhen

BehaviorSubject

RxJava 中有一个较少被人用到的类叫做 Subject,它是一种『既是 Observable,又是 Observer』的东西,因此可以被用作中间件来做数据传递。例如,可以用它的子类 BehaviorSubject 来制作缓存。代码大致形式:
api.getData()
.subscribe(behaviorSubject); // 网络数据会被缓存behaviorSubject.subscribe(observer);//之前的缓存将直接送达 observer

  • BehaviorSubject
  • loadFromNetWork
  • loadFromNetWork

doOnNext()

doOnNext(new Action1<FakeToken>() { 
//do系列的作用是side effect,当onNext发生时,它被调用,不改变数据流。                                           //doOnNext()允许我们在每次输出一个元素之前做一些额外的事情。                                           //e.g: 你的程序取到的 User 并不应该直接显示,而是需要先与数据库中的数据进行比对和修正后再显示。                                              @Override                                             
public void call(FakeToken fakeToken) {                                                    tokenUpdated = true;
cachedFakeToken.token = fakeToken.token;
cachedFakeToken.expired = fakeToken.expired;
 }
});

subscribeOn/observeOn

  • subscribeOn() 的线程控制可以从事件发出的开端就造成影响
  • observeOn() 执行时的当前 Observable 所对应的 Subscriber ,即它的直接下级 Subscriber
    • observeOn() 指定的是它之后的操作所在的线程。
    • 因此如果有多次切换线程的需求,只要在每个想要切换线程的位置调用一次 observeOn() 即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值