标签:
开源地址:https://github.com/excilys/androidannotations第一步:先打开Help菜单,点击Install New Software
第二步,选择安装Juno:
第三步,在下面的列表中找到Programming Languages节点并展开,找到Eclipse Java Development Tools,勾选上,剩下的安装步骤你懂的,安装完了会要求自动重启Eclipse,重启后就有Annotation Processing啦。
重启后发现就会发现那个配置,
当View相关的成员变量初始化完毕后,会调用拥有@AfterViews注解的方法,你可以在里面初始化一些界面控件等。如果其他的成员变量处事完毕,就会调用@AfterInject。
比如大多数应用的逻辑是这样的,初始化界面之后,就发起耗时的数据请求,然后解析获取到的数据,再设置到界面上。一般的涉及UI线程与异步任务交互的时候,相对都比较麻烦一些。让我们看下AA是如何实现的。
很简单吧,UI线程执行的方法加个@UiThread,异步线程方法加个@Background,两者的交互就是方法直接的相互调用,其他的你不用关心,一切的实现都是AA的编译器去自动生成交互的代码。交互的过程,完全没有在执行异步的感觉,不用再使用Handler去发送接收Message了。两个注解就把以前一堆的代码实现的功能给实现了,真心给个最大的赞。
五、Rest API在AA中也支持Rest API,而且支持所有的HTTP请求方法。下面演示的是一个GET请求。
@Rest("http://www.bookmarks.com")
public interface BookmarkClient {
@Get("/bookmarks/{userId}?search={search}")
Bookmarks getBookmarks(String search, String userId);
}
@Background
void searchAsync(String searchString, String userId) {
Bookmarks bookmarks = restClient.getBookmarks(searchString, userId);
updateBookmarks(bookmarks);
}
/**
*samy
*/
@EActivity(R.layout.activity_a20thirdparty_androidannotations_aamain)
// Sets content view to R.layout.translate
public class AAMainAct extends Activity {
@ViewById
// Injects R.id.textInput
// 提供id来生成控件,如果不指定ID,默认以控件名进行查找,如上面的myEditText
EditText myEditText;
@ViewById(R.id.myTextView)
// Injects R.id.myTextView
TextView textView;
@AnimationRes
// Injects android.R.anim.fade_in
Animation fadeIn;
@StringRes(R.string.hello)
String helloFormat;
@ColorRes
int androidColor;
@BooleanRes
boolean someBoolean;
@SystemService
NotificationManager notificationManager;
@SystemService
WindowManager windowManager;
//当View相关的成员变量初始化完毕后,会调用拥有@AfterViews注解的方法,你可以在里面初始化一些界面控件等。如果其他的成员变量处事完毕,就会调用@AfterInject。
/**
* AndroidAnnotations gracefully handles support for onBackPressed, whether you use ECLAIR (2.0), or pre ECLAIR android version.
*/
public void onBackPressed() {
super.onBackPressed();
Toast.makeText(this, "Back key pressed!", Toast.LENGTH_SHORT).show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// windowManager should not be null
windowManager.getDefaultDisplay();
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
}
// //事件控制,可以以按钮的id作为方法名,同时支持的事件还有onLongClick,onTextChange等
// @LongClick
// When R.id.myButtonClicked button is clicked
// android:id="@+id/myButton"
// 两种点击事件方法都可以的;myButton() myButtonClicked()
@Click
void myButton() {
// void myButtonClicked() {
String name = myEditText.getText().toString();
setProgressBarIndeterminateVisibility(true);
someBackgroundWork(name, 5);
}
/**
* 对于@Click,方法名和xml文件中的id一样就可以这样写,AndroidAnnotations会自动识别,对于
* 多个Button,可以写多个@Click,也可以在这样
*/
// @Click({R.id.button1,R.id.button2,R.id.button3})
// void buttonClicked(Button bt){
// switch(bt.getId()){
// case R.id.button1: //
// break;
// ...
// }
// }
@Background
// Executed in a background thread
// 开启新线程后台运行,注意不要引用UI控件,而且返回值类型一定是void
void someBackgroundWork(String name, long timeToDoSomeLongComputation) {
try {
TimeUnit.SECONDS.sleep(timeToDoSomeLongComputation);
}
catch (InterruptedException e) {
}
String message = String.format(helloFormat, name);
updateUi(message, androidColor);
showNotificationsDelayed();
}
@UiThread
// Executed in the ui thread//UI线程
void updateUi(String message, int color) {
setProgressBarIndeterminateVisibility(false);
textView.setText(message);
textView.setTextColor(color);
}
@UiThread(delay = 2000)
// 可以设置延时时间,以毫秒为单位
void showNotificationsDelayed() {
Notification notification = new Notification(R.drawable.ic_launcher, "Hello !", 0);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(), 0);
notification.setLatestEventInfo(getApplicationContext(), "aa notification", "aa_test!", contentIntent);
notificationManager.notify(1, notification);
}
// android:id="@+id/startExtraActivity"
@LongClick
void startExtraActivity() {
// 这个传值有点不好弄
Intent intent = AAWithExtraAct_.intent(this).myDate(new Date()).myMessage("hello !").classCastExceptionExtra("42").get();
// Intent intent = ActivityWithExtra_.intent(this).myDate(new Date()).myMessage("hello !").get();
// intent.putExtra(ActivityWithExtra_.MY_INT_EXTRA, 42);
startActivity(intent);
}
@Click
void startListActivity(View v) {
startActivity(new Intent(this, AAListAct_.class));
}
@Touch
void myTextView(MotionEvent event) {
Toast.makeText(this, "myTextView was touched!: " , Toast.LENGTH_SHORT).show();
}
@Transactional
int transactionalMethod(SQLiteDatabase db, int someParam) {
return 42;
}
}
Butter Knife也是使用注入视图的方式使开发人员尽可能少的编写代码。相比AndroidAnnotations,个人觉得没有AndroidAnnotations
使用简单,而且文档几乎也没有。还是先看一小段代码吧:
package com.example.butterknife;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.InjectView;
import butterknife.OnClick;
import butterknife.ButterKnife;
import butterknife.OnItemClick;
import butterknife.OnLongClick;
import static android.widget.Toast.LENGTH_SHORT;
public class SimpleActivity extends Activity {
@InjectView(R.id.title) TextView title;
@InjectView(R.id.subtitle) TextView subtitle;
@InjectView(R.id.hello) Button hello;
@InjectView(R.id.list_of_things) ListView listOfThings;
@InjectView(R.id.footer) TextView footer;
private SimpleAdapter adapter;
@OnClick(R.id.hello) void sayHello() {
Toast.makeText(this, "Hello, views!", LENGTH_SHORT).show();
}
@OnLongClick(R.id.hello) boolean sayGetOffMe() {
Toast.makeText(this, "Let go of me!", LENGTH_SHORT).show();
return true;
}
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
// Contrived code to use the "injected" views.
title.setText("Butter Knife");
subtitle.setText("View \"injection\" for Android.");
footer.setText("by Jake Wharton");
hello.setText("Say Hello");
}
}
总之,两者虽有相似的地方,但看到AndroidAnnotations之后,就不愿使用Butter Knife了。另外,值得你注意的是butter Knife
有个代码生成的插件呢,不过是针对Android Studio的,请看图:
(gif 的图为什么不会动啊)
Generate
-> Generate ButterKnife Injections
点击 Confirm
, 代码自动生成!插件项目主页:
https://github.com/inmite/android-butterknife-zelezny
下载插件:
http://plugins.jetbrains.com/plugin/7369
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Try to generate Activity injections by clicking to R.layout.activity_main
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new Fragment())
.commit();
}
}
}
标签:
原文地址:http://www.cnblogs.com/hongfeiliuxing/p/4468307.html