Jet
極簡(jiǎn)輕量的標(biāo)簽注解庫(kù)粘茄,總共才28K秒紧;
Git 地址:
https://github.com/gybin02/Jet/
功能
使用注解功能 來(lái)實(shí)現(xiàn)去除一些重復(fù)的模板代碼犀勒,讓Code更簡(jiǎn)單僻孝;
比如 類(lèi)似 butterknife功能消略; 自動(dòng)初始化Field和Method
命名來(lái)自 WordPress的Jetpack;
每個(gè)注解做的事情要很簡(jiǎn)單,符合kiss原則
已完成
@JFindView([ViewId])
運(yùn)行時(shí)注入章钾,支持 自動(dòng)初始化 View的findViewById
@JFindViewOnClick([ViewId])
支持 自動(dòng)初始化View的 findViewById 和 onClick
Activity 需要 implement View.OnClickListener.class;
@JIntent([key])
使用Annotation Runtime實(shí)現(xiàn)getIntent功能來(lái)讀取Intent里面的數(shù)據(jù)墙贱;
支持自動(dòng)從 Intent 里取值,比如Intent.getStringExtra([String]) 等
支持的參數(shù)類(lèi)型具體如下(包括默認(rèn)值)
return intent.getStringExtra(value)
return intent.getCharExtra(value, '\0');
return intent.getCharExtra(value, '\0');
return intent.getByteExtra(value, (byte) 0);
return intent.getShortExtra(value, (short) 0);
return intent.getIntExtra(value, 0);
return intent.getLongExtra(value, 0);
return intent.getFloatExtra(value, 0);
return intent.getDoubleExtra(value, 0);
return intent.getBooleanExtra(value, false);
return intent.getSerializableExtra(value);
return intent.getBundleExtra(value);
return intent.getStringArrayExtra(value);
return intent.getStringExtra(value);
使用例子
//原來(lái)代碼
public class DemoActivity implement View.OnClickListener{
//Android 代碼
private String testString;
private boolean testBoolean;
private int testInt;
private long testLong;
private Button btnHello;
private Button btn_test;
//用值
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//Intent 初始化
Intent intent = getIntent();
testString = intent.getIntExtra("testString", 0);
testInt = intent.getStringExtra("testInt");
testBoolean = intent.getStirngExtra("testBoolean");
testLong = intent.getBooleanExtra("testLong");
//View 初始化
btnHello= findViewById(R.layout.btn_hello);
btn_test= findViewById(R.layout.btn_test);
btnHello.setOnClick(this);
Log.i("old",test1);
}
public void onClick(View v){
int id= v.getId;
if(id== hello_world){
//TODO Do Something
}
}
//TODO:如果需要取參的越來(lái)越多贱傀,代碼會(huì)是什么樣的呢惨撇?邏輯上是不是很復(fù)雜
使用 Jet注解實(shí)現(xiàn):
@JIntent("testString")
private String testString;
@JIntent("testBoolean")
private boolean testBoolean;
@JIntent("testInt")
private int testInt;
@JIntent("testLong")
private long testLong;
@JFindViwOnClick("btn_hello")
private Button btnHello;
@JFindViw("btn_test")
private Button btn_test;
//用值
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//初始化后,既可使用所有屬性
Jet.init(this);
}
public void onClick(View v){
int id= v.getId;
if(id== hello_world){
//TODO Do Something
}
}
NON-ACTIVITY BINDING
You can also perform binding on arbitrary objects by supplying your own view root.
你可以任意綁定對(duì)象府寒,只要你提供一個(gè)View Root;
public class FancyFragment extends Fragment {
@JFindView(R.id.button1) Button button1;
@JFindView(R.id.button2) Button button2;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fancy_fragment, container, false);
Jet.bind(this, view);
// TODO Use fields...
return view;
}
}
Another use is simplifying the view holder pattern inside of a list adapter.
public class MyAdapter extends BaseAdapter {
@Override public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
view = inflater.inflate(R.layout.whatever, parent, false);
holder = new ViewHolder(view);
view.setTag(holder);
}
holder.name.setText("John Doe");
// etc...
return view;
}
static class ViewHolder {
@JFindView(R.id.title) TextView name;
@JFindView(R.id.job_title) TextView jobTitle;
public ViewHolder(View view) {
Jet.bind(this, view);
}
}
}
You can see this implementation in action in the provided sample.
@JImplement
實(shí)現(xiàn) 根據(jù)接口類(lèi)魁衙,自動(dòng)調(diào)用實(shí)現(xiàn)類(lèi)功能,類(lèi)似Summer
功能 比Summer簡(jiǎn)單株搔;只需要一個(gè)注釋?zhuān)梢杂糜诳鏼odule功能調(diào)用剖淀,但是不僅于此 更多功能可以自己發(fā)掘;纤房;使用Java 動(dòng)態(tài)代理實(shí)現(xiàn)纵隔;2017.05.23 finish
使用方法:
接口類(lèi)
@JImplement("com.seeker.tony.myapplication.proxy.TestImpl")
public interface ITest {
public void test();
public String getValue();
}
實(shí)現(xiàn)類(lèi):
//@JProvider 可有可無(wú),只是用來(lái)標(biāo)識(shí)實(shí)現(xiàn)類(lèi)炮姨,避免被認(rèn)為是無(wú)功能調(diào)用被刪掉捌刮;
@JProvider
public class TestImpl {
private static final String TAG = "TestImpl";
public void test() {
Log.d(TAG, "test Method invoke");
}
public String getValue() {
String str = "HelloWorld";
Log.d(TAG, "getValue Method invoke: " + str);
return str;
}
}
調(diào)用方法:
ITest iTest = JetProxy.getInstance().create(ITest.class);
iTest.test();
iTest.getValue();
Download
dependencies {
//內(nèi)部使用
//compile 'com.meiyou.framework:jet:0.0.7-SNAPSHOT'
compile 'com.meiyou.framework:jet:1.0.0'
}
Snapshots of the development version are available in Sonatype's snapshots repository.
待實(shí)現(xiàn),
待實(shí)現(xiàn)區(qū)域舒岸,列了一些我想到的通用功能绅作, 但是項(xiàng)目里面肯定還存在很多通用的功能;歡迎 各位 提Issue蛾派,讓項(xiàng)目更強(qiáng)大棚蓄;
- @JTrycatch
AspectJ來(lái)實(shí)現(xiàn)
安全調(diào)用方法:給方法 自動(dòng)加入 try Catch ;
已經(jīng)實(shí)現(xiàn)堕扶,參考: Jet-AOP 工程;
- 類(lèi)似Retrofit的 RestFull 請(qǐng)求庫(kù)實(shí)現(xiàn)梭依;
@GET, @Post; @Head等典尾;
https://github.com/Tamicer/Tamic_Retrofit
常見(jiàn)問(wèn)題
- 性能測(cè)試役拴;O(1)方法,20個(gè)@JFindView 屬性初始化钾埂,耗時(shí)50ms;比直接FindViewById多花5ms,性能損耗基本可以忽略河闰;
- Fragment實(shí)現(xiàn); 已經(jīng)支持 2017.0525
- ViewHolder實(shí)現(xiàn)褥紫; 已經(jīng)支持 2017.0525
- 運(yùn)行時(shí)注入姜性,可以改為 編譯時(shí)注入
- 有些注解實(shí)現(xiàn) 需要使用AOP技術(shù);可以參考[Jet-AOP](http://git.meiyou.im/Android/JetAop) 工程髓考;
后記:
- 后面會(huì)對(duì)怎么實(shí)現(xiàn)寫(xiě)幾篇文章部念;
- Annotation的使用還有很多地方還可以繼續(xù)優(yōu)化;