Greenfit

EnglishVersion

一个用来将Retrofit注解预编译从而最大减少其使用反射的库。

前面讲了Retrofit的基本原理,见 Retrofit如何使用如何work,末尾提到了Retrofit使用了大量的反射,所以又写了一个预编译Retrofit的解析库。

使用方法

Greenfit-sample中列出了Greenfit的基本使用方式。

plugin

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}
apply plugin: 'com.neenbedankt.android-apt'

这里需要接入com.neenbedankt.android-apt来使用apt,即AnnotationProcessTool。目前最新版为1.8,最好使用最新版。

dependency

def greenfitVersion = "{lastedVersion}"
dependencies {
	compile "me.yourbay.greenfit:greenfit:$greenfitVersion";
	apt "me.yourbay.greenfit:greenfit-compiler:$greenfitVersion"
}

目前Greenfit的最新版本为0.1-beta

添加代码

接入 Greenfit 之后不需要额外添加任何代码,你只需要在你的API类上添加@Greenfit注解,编译之后会 Greenfit 会自动解析之。

添加Greenfit注解

在你的Api类添加@Greenfit的注解。比如:

@Greenfit
public interface Api {
	// ...
}

添加这个注解的目的是为了让GreenfitProcessor能找到Retrofit接口类,后面才能进行预编译。

使用Greenfit

添加完Greenfit注解之后build一下,这样就会自动生成一个ApiImpl.java(命名规则为{name}+"Impl.java",上面举例的文件为Api.java,所以生成为ApiImpl.java)

其实与正常使用Retrofit区别不大。

先来回顾一下Retrofit的使用:

retrofit.create(Api.class).pmBody(B_SINGLE).enqueue(callback);

再来看看使用Greenfit预编译之后的使用方式:

ApiImpl.pmBody(retrofit, B_SINGLE).enqueue(callback);

是不是区别不大?

代码示例

Api.java中的接口:

@GET("/get")
@Headers({"k0:v0", "k1:v1", "content-type:text/plain; charset=UTF-8"})
Call<Model> pmHeader(@Header("Single-Header") Param header, @HeaderMap Map<String, Param> headers);

编译后的ApiImpl.java的实现:

高能预警,这里的代码可能会引起不适,并没有format且为了减小代码量已将部分类缩短,比如P/PHF/PT等等。(不可取)

public static final Call<Model> pmHeader(final Retrofit t, Param header,
  Map<String, Param> headers) {
final Type resp = Model.class;
return (Call<Model>)GreenMethod.builder(t).type(new PT(Call.class,resp),resp).rUrl("/get").m("GET").contentType("text/plain; charset=UTF-8").headers(new String[] { "k0","v0","k1","v1"})
.ph(new PHF(t,new P[]{new P(Object.class,"Single-Header",18),new P(Param.class,58)}).get())
.build().adapt(new Object[]{header,headers});}

打包的时候Api.java文件可以安全的Proguard掉了。

其他配置

文件后缀

Greenfit可以设定Api接口预编译文件的后缀名。

apt {
    arguments {
        greenFileSuffix 'Impl'
    }
}

如果你不设定的话默认为Impl。例如: Api.javaGreenfitApiImpl.java

缓存Method

这里跟Retrofit中缓存ServiceMethod类似。 默认是关闭的即greenMethodCachefalse

如果你想开启缓存的话,只需要向上面一样将greenMethodCache设定为true即可。

apt {
    arguments {
        greenMethodCache false
    }
}

如果想清除的话,只需要调用GreenCache.I.clear()即可。

其他

MethodAnnotation/ParameterAnnotation

  • Converter.Factory 得到的将是空Annotation空数组
  • CallAdapter.Factory 中将会得到也是Annotation空数组
  • 目前Retrofit只检测checkNotNull而不checkNotEmpty,所以给到了一个空数组

截图

License

Copyright © 2017 hyongbai hyongbai@gmail.com

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

By @hyongbai 共3047个字

本文链接 http://yourbay.me/all-about-tech/2017/04/18/greenfit/