使用ConstraintLayout构建一个灵活的布局

简介

ConstraintLayout允许你在不使用任何嵌套的情况下创建大型而又复杂的布局。它与RelativeLayout非常相似,所有的view都依赖于兄弟控件和父控件的相对关系。但是,ConstraintLayout比RelativeLayout更加灵活且在Android Studio的布局编辑器中更易于使用。
由于ConstraintLayout所能做的一切都可以从布局编辑器的可视化工具中直接获取,所以你可以完全使用拖拽的方式来构建布局。此外,ConstraintLayout可以兼容到Android 2.3 (API9),所以我们不用担心兼容上的问题。

RxJava2.x 浅析

作者: maplejaw
开源库地址:https://github.com/ReactiveX/RxJava
版本: compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC1'

前段时间阅读了RxJava1.x的源码,刚好RxJava2.x也发布了RC版,为了迎接10月底的正式版,趁热打铁,本篇将对RxJava2.x进行一个简单的剖析。

Observable

在RxJava1.x中,最熟悉的莫过于Observable这个类了,笔者刚使用RxJava2.x时,创建一个Observable后,顿时是懵逼的。因为我们熟悉的Subscriber居然没影了,取而代之的是ObservableEmitter,俗称发射器。此外,由于没有了Subscriber的踪影,我们创建观察者时需使用Observer。而Observer也不是我们熟悉的那个Observer,其回调的Disposable参数更是让人摸不到头脑。

RxJava操作符大全

作者: maplejaw
本篇只解析标准包中的操作符。对于扩展包,由于使用率较低,如有需求,请读者自行查阅文档。

创建操作

以下操作符用于创建Observable。

  • create: 使用OnSubscribe从头创建一个Observable,这种方法比较简单。需要注意的是,使用该方法创建时,建议在OnSubscribe#call方法中检查订阅状态,以便及时停止发射数据或者运算。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        
    Observable.create(new Observable.OnSubscribe<String>() {

    @Override
    public void call(Subscriber<? super String> subscriber) {

    subscriber.onNext("item1");
    subscriber.onNext("item2");
    subscriber.onCompleted();
    }
    });

RxJava 源码解读

开源库地址:https://github.com/ReactiveX/RxJava
解读版本:1.1.8

基本概念

RxJava 是一个基于Java的响应式扩展实现: 即一个通过使用可观察序列来编写异步和基于事件的程序库。
它扩展了观察者模式以支持数据/事件序列,您可以根据声明好的规则通过操作符将序列组合在一起,而不用去担心低级别的线程,同步,线程安全和并发数据结构的各种问题。

基本用法

前面既然说了RxJava扩展了观察者模式,也就是说,RxJava是采用观察者模式实现的。既然是观察者模式,那么一定需要两个东西,被观察者和观察者。

OkHttp3 源码解读

开源库地址:https://github.com/square/okhttp
解读版本:3.4.1

Okhttp是目前非常流行的网络请求库,出自Square公司。对于该库的使用,相信大家已经比较熟悉了。今天,我将从源码角度对Okhttp3进行剖析。

基本使用

Okhttp的使用可以分为四步:

  1. 初始化客户端(实际应用中应当保持单例)

    1
    2
    3
    4
    //获取一个客户端
    OkHttpClient client = new OkHttpClient.Builder()
    ...
    .build();
  2. 构建Request

    1
    2
    3
    4
       //构建一个Request
    Request request = new Request.Builder()
    .url(url)
    .build();
  3. 获取Call对象

    1
    2
       //获取Call对象
    Call call=client.newCall(request);
  4. 发送请求(execute同步/enqueue异步)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     //同步调用
    Response response = call.execute();

    //异步调用
    call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {

    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {

    }
    });

HttpURLConnection 源码解读

我们知道,自Android6.0后HttpClient已经被废除,我们连接网络的选择基本在HttpURLConnection和OkHttp间抉择,本篇准备从源码角度解读HttpURLConnection。

基本使用

HttpURLConnection的使用大体可以分为以下几步:

  1. 初始化URL,使用openConnection获取连接。
  2. 通过HttpURLConnection设置请求参数,connect()开启真正连接。
  3. 通过getOutputStream()写入请求体(POST等)
  4. 通过getInputStream()读取相关内容。
  5. 关闭资源

Retrofit2 源码解读

基本概念

Retrofit 是一个针对Java/Android类型安全的Http请求客户端。
基本使用如下:

  1. 首先定义一个接口,抽象方法的返回值必须为Call<XX>

    1
    2
    3
    4
    public interface GitHubService {
    @GET("users/{user}/repos")
    Call<List<Repo>> listRepos(@Path("user") String user);//默认CallAdapter返回值必须为`Call<XX>`。
    }
  2. 通过Retrofit的create创建接口实现

    1
    2
    3
    4
    5
    6
    7
    8
     //初始化Retrofit
    Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/") //必须以斜杠结尾
    .addConverterFactory(GsonConverterFactory.create())//添加Gson转换工厂
    .build();

    //通过Retrofit创建接口实现
    GitHubService service = retrofit.create(GitHubService.class);
  3. 接口调用相关方法获取Call<XX>,然后就能和Okhttp一样进行同步/异步调用。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Call<List<Repo>> repos = service.listRepos("octocat");
    //异步调用
    repos.enqueue(new Callback<List<Repo>>() {
    @Override
    public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
    List<String> list=response.body();//调用body()
    }

    @Override
    public void onFailure(Call<List<Repo>> call, Throwable t) {

    }
    });
    //同步调用
    Response<List<Repo>> response=repos.execute();

Python3 学习手册(二) 流程控制语句

上一篇,我们学习了Python中的基本数据类型,也顺带讲了下while循环。本篇开始系统的介绍一些流程控制语句。为了方便演示,本篇开始将部分源码写成.py文件,然后运行测试。
1.gif-895.6kB
首次我们建立demo.py的文本文件。然后使用Python自带的IDIE打开编程即可。按F5即可运行程序。

Gson 源码解读

开源库地址:https://github.com/google/gson
解读版本:2.7

Gson是一个可以用来将Java对象转换为JSON字符串的Java库。当然,它也可以把JSON字符串转换为等价的Java对象。网上已经有了不少可将Java对象转换成JSON的开源项目。但是,大多数都要求你在Java类中加入注解,如果你无法修改源码的话就比较坑爹了,此外大多数开源库并没有对泛型提供完全的支持。于是,Gson在这两个重要的设计目标下诞生了。Gson可以作用于任意的Java对象(包括接触不到源码的),与此同时还加入了完整的泛型支持。