什么是Android Annotations?它们有什么用途?

41

我想了解Android Annotations,它是在所有Android项目中使用的更好方法吗?

如果正确,如何实现它。是否有任何好的教程?

如果这是错误的方法。Android Annotations的缺点是什么?

提前感谢您的帮助。

5个回答

46

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的行为有很好的了解即可。

总之,像任何库一样,如果您依赖于它,那么您就依赖于它,所以您最好非常彻底地了解它的工作原理。您的项目现在取决于其他人的项目。


9

我不再使用Android Annotations。当我使用这个库时,它经常出现错误,给调试带来了噩梦般的体验。另一个缺点是会降低代码的可移植性。如果你在独自开发项目,那么这没有问题,但是如果你在团队中工作,必须重新考虑。

如果你想使用它,在它们的网站上有很多教程。

另一种选择: 如果你想减少代码量,同时使代码易于使用和理解,我建议你使用Butter Knife库。我经常使用它,迄今为止没有遇到任何错误。非常容易使用和阅读。


6

Android Annotations是一个库,通过使用一些属性或注释(如@EActivity、@ViewById、@OnClick)“自动生成”代码。它旨在简化和减少编码时间。

“AndroidAnnotations是一个加速Android开发的开源框架。它处理了管道工作,让你专注于真正重要的事情。通过简化您的代码,它可以简化其维护。”

(文档在此处:https://github.com/excilys/androidannotations/wiki

但是……我们不使用它,我完全同意DDsix的答案。使用SOLID原则,在应该编写代码的时间和地点编写代码……


4

Android Annotations是一个第三方库,旨在成为Android的一站式解决方案。它可以进行依赖注入、线程处理等操作。但我不建议使用它,因为它存在漏洞且不稳定。在我的当前工作中,我的任务是移除Android Annotations。我建议使用Dagger 2、Butterknife和RxJava。


2
这是一个关于Android Studio的例子。
  1. Create an Android project with the "Empty Activity" template.
  2. 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'
    ==>     }
        }
    }
    
  3. 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'
    }
    
  4. 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" />
    

  5. 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>
    

  6. 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!");
        }
    }
    
  7. Try to run it with a device or a emulator to see how simple it works.


谢谢,这真的很有帮助,但我们需要记住两件事:1- 在任何Java文件中调用MainActivity时,我们必须使用MainActivity_名称而不是MainActivity;2- 清理项目后,如果有任何问题,请与Gradle文件同步。 - priyanka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接