我想了解Android Annotations,它是在所有Android项目中使用的更好方法吗?
如果正确,如何实现它。是否有任何好的教程?
如果这是错误的方法。Android Annotations的缺点是什么?
提前感谢您的帮助。
我想了解Android Annotations,它是在所有Android项目中使用的更好方法吗?
如果正确,如何实现它。是否有任何好的教程?
如果这是错误的方法。Android Annotations的缺点是什么?
提前感谢您的帮助。
Android Annotations是一个基于注解的框架,可以简化应用程序中的代码,并减少常见模式的样板代码,例如设置点击监听器、执行UI/后台线程等。
您可以从以下代码逐步演变而来:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView descriptionTextView = (TextView) findViewById(R.id.tv_description);
final Button hideButton = (Button) findViewById(R.id.btn_hide);
hideButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
descriptionTextView.setVisibility(View.INVISIBLE);
}
});
}
}
变成这样:
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@ViewById(R.id.tv_description)
TextView mDescriptionTextView;
@Click(R.id.btn_hide)
protected void onHideButtonClick() {
mDescriptionTextView.setVisibility(View.INVISIBLE);
}
}
它是如何工作的
您注释您的活动和组件,然后注释处理器会生成类(在编译时)来扩展您的活动和组件(即您的活动不能是final),默认情况下带有下划线后缀,因此如果您有MainActivity
,现在您还将拥有一个MainActivity_
类。
这个新类包含了一个很好的样板代码,可以执行注释指定的任何操作。
如何实现
我写了这篇关于如何集成Android Annotations的教程,甚至包括一个示例说明如何更新集成测试,请点击这里。
该教程截至今天为止,使用的是Android Studio 〜1.5.1,并试图解释一下内部工作原理。
是否应该使用它?
我认为如果您有一个中小型项目就可以使用。 它可以使您的代码更易于阅读。但是,如果您的应用程序更大且包含许多具有复杂活动/组件生命周期的导航流,则实施起来可能会有些困难或者如果未正确注释,则难以调试和理解错误。
由于Android Annotations的操作方式,它们嵌入在生命周期中,因此 您现在依赖于它们的生命周期(例如,如果您使用@ViewById
注释视图,则不能在onCreate()
中引用它们,您需要创建一个方法并用@AfterViews
进行注释,当这个方法被执行时,您的视图就准备好使用了)。这不一定是一个问题,您只需要对Android的行为及Android Annotations的行为有很好的了解即可。
总之,像任何库一样,如果您依赖于它,那么您就依赖于它,所以您最好非常彻底地了解它的工作原理。您的项目现在取决于其他人的项目。
我不再使用Android Annotations。当我使用这个库时,它经常出现错误,给调试带来了噩梦般的体验。另一个缺点是会降低代码的可移植性。如果你在独自开发项目,那么这没有问题,但是如果你在团队中工作,必须重新考虑。
如果你想使用它,在它们的网站上有很多教程。
另一种选择: 如果你想减少代码量,同时使代码易于使用和理解,我建议你使用Butter Knife库。我经常使用它,迄今为止没有遇到任何错误。非常容易使用和阅读。
Android Annotations是一个库,通过使用一些属性或注释(如@EActivity、@ViewById、@OnClick)“自动生成”代码。它旨在简化和减少编码时间。
“AndroidAnnotations是一个加速Android开发的开源框架。它处理了管道工作,让你专注于真正重要的事情。通过简化您的代码,它可以简化其维护。”
(文档在此处:https://github.com/excilys/androidannotations/wiki)
但是……我们不使用它,我完全同意DDsix的答案。使用SOLID原则,在应该编写代码的时间和地点编写代码……
Android Annotations是一个第三方库,旨在成为Android的一站式解决方案。它可以进行依赖注入、线程处理等操作。但我不建议使用它,因为它存在漏洞且不稳定。在我的当前工作中,我的任务是移除Android Annotations。我建议使用Dagger 2、Butterknife和RxJava。
Edit the project_root/build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
==> classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
allprojects {
repositories {
jcenter()
==> maven {
==> url = 'https://oss.sonatype.org/content/repositories/snapshots'
==> }
}
}
Edit the app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'android-apt' <============
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.just.myapplication"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
==> apt "org.androidannotations:androidannotations:4.0-SNAPSHOT"
==> compile 'org.androidannotations:androidannotations-api:4.0-SNAPSHOT'
}
Add a TextView and a Button in the main layout, activity_main.xml
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Not Click Yet"
android:id="@+id/textView"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:id="@+id/button"
android:text="Click"
android:layout_below="@+id/textView" />
Change the activity name to "MainActivity_" in AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
==> <activity android:name=".MainActivity_">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
Now, your MainActivity.java could be simplified as below
package com.just.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;
@EActivity (R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@ViewById(R.id.textView)
TextView mText;
@Click
void button() {
mText.setText("Button Clicked!");
}
}
Try to run it with a device or a emulator to see how simple it works.