Jet annotation library

Liverpoolfc.tv: gybin02. Making. IO/Jet /

Use annotations to achieve the removal of some duplicate template Code, make Code simpler; Includes Butterknife functionality; Automatically initialize the Field in the Activity.

Named Jetpack from WordPress;

  • Keep it simple and stupid by doing something simple with each annotation
  • Heart_eyes: :heart_eyes:
  • If you like, please give a Star smile

Has been completed

Note the name role note
@JFindView Equal to the findViewById Supports activities, fragments,ViewHolder, etc
@JFindViewOnClick FindViewById () and View.setonClickListener (this) The Activity needs to implement the View.onClickListener interface
@JOnClick The annotation on the method is view.setonClickListener Support single View and multiple views, method parameter with View View, you can return the View click
@JIntent Used to automatically resolve values in an Intent It can also be automatically evaluated from the Bundle
@JImplement For decoupling, the implementation is invoked based on the interface value
@JProvider Cooperate with JImplement
@JPermission 6.0 automatically apply for permission; Support multiple permissions
@JPermissionGrant Permission authorization succeeded Cooperate with @jPermission, optional
@JPermissionDeny Permission authorization failure Cooperate with @jPermission, optional

@JFindView([ViewId])

Runtime injection, which automatically initializes the findViewById of a View

@JFindViewOnClick([ViewId])

Support automatic initialization of View findViewById and onClick

The Activity needs to implement the View. An OnClickListener. Class;

@JIntent([key])

The Annotation Runtime implements the getIntent function to read the data in the Intent.

Automatic value from intents, such as intent.getStringExtra ([String])

The supported parameter types are as follows (including default values)

           return intent.getStringExtra(value)

           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);Copy the code

Using the example

    // The original code
   public class DemoActivity implement View.OnClickListener{
     / / Android code

      private String testString;
      private boolean testBoolean;
      private int testInt;
      private long testLong;

      private Button btnHello;
      private Button btn_test;


      / / value
      public void onCreate(Bundle savedInstanceState){
         super.onCreate(savedInstanceState);
        / / Intent initialization
          Intent intent = getIntent();
          testString = intent.getIntExtra("testString".0);
          testInt = intent.getStringExtra("testInt");
          testBoolean = intent.getStirngExtra("testBoolean");
          testLong = intent.getBooleanExtra("testLong");

         / / the View initialization
        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:What would your code look like if you had to take more and more parameters? Is it logically complicatedCopy the code

Using Jet annotations:

    @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;

      / / value
      public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        // All attributes can be used after initialization
        Jet.init(this);
      }

      public void onClick(View v){
          int id= v.getId;
          if(id== hello_world){
            //TODO Do Something}}Copy the code

Example 2

   // Support direct value from Bundle;
    @JIntent("param1")
    private String mParam1;
    @JIntent("param2")
    private String mParam2;


    public static BlankFragment newInstance(Activity activity) {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        String param1 = "Hello ";
        String param2 = "world";
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Jet.bind(this, getArguments());Copy the code

Non-activity BINDING for other classes

You can also perform binding on arbitrary objects by supplying your own view root.

You can bind any object you want as long as you provide a 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...
    returnview; }}Copy the code

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.Copy the code

@JImplement :heart_eyes: :heart_eyes: :heart_eyes:

  • Implementation according to the interface class annotation, automatic call implementation class function, code decoupling necessary; Instead of direct write reflection
  • Can also be used for cross-module function calls, but more than that can be discovered on your own;

Usage:

Interface class

@JImplement("com.seeker.tony.myapplication.proxy.TestImpl")
public interface ITest {
    public void  test(a);

    public String getValue(a);
}Copy the code

Implementation class:

// @jprovider is used to identify the implementation class to avoid confusion and avoid being deleted as a non-functional call;
@JProvider
public class TestImpl {

    private static final String TAG = "TestImpl";

    public void test(a) {
        Log.d(TAG, "test Method invoke");
    }

    public String getValue(a) {
        String str = "HelloWorld";
        Log.d(TAG, "GetValue Method invoke:" + str);
        returnstr; }}Copy the code

Call method:

                    ITest iTest = JetProxy.getInstance().create(ITest.class);
                    iTest.test();
                    iTest.getValue();Copy the code

Automatic permission application on JPermission 6.0;

//@JPermission(all = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_CONTACTS}) @JPermission(Manifest.permission.CAMERA) public class MainActivity extends AppCompatActivity .... @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionsManager.getInstance().notifyPermissionsChange(permissions, grantResults); } @jpermissionGrant private void onGrand() {toast.maketext (mainactivity.this, "onGrant Success", Toast.LENGTH_SHORT) .show(); } @jpermissionDeny private void onDeny(String permisson) {toast.makeText (mainactivity.this, "onDenied Success: "+permisson, Toast.LENGTH_SHORT) .show(); }Copy the code

Download

dependencies {
   // For internal use
   / / the compile 'com. Meiyou. Framework: jet: 0.0.10 - the SNAPSHOT'
   compile 'com. Meiyou. Framework: jet: 1.5.0'

}Copy the code

Snapshots of the development version are available in Sonatype’s snapshots repository.

Confused configuration:

# Use the JetProxy feature to avoid confusion
-keepattributes *Annotation*
-keep class * extends java.lang.annotation.Annotation { *; }
-keep @com.meiyou.jet.annotation.JImplement class * { *; }
-keep @com.meiyou.jet.annotation.JProvider class * { *; }Copy the code

To implement,

The implementation area lists some common features that I have in mind, but there are certainly many common features in the project; Welcome to raise the Issue, make the project more powerful;

  • @JTrycatch

Safely calling a method: automatically add a try Catch to the method;

Implemented using AspectJ. Specific reference: JET-AOP project;

  • Retrofit-like implementation of the RestFull request library; @ GET @ Post; @ Head, etc.; Github.com/Tamicer/Tam…

Q&A

  • Performance test; O(1) method, 20 @jFindView attributes initialization, 50ms; It takes 5ms more than direct FindViewById, and the performance loss is basically negligible.
  • Some annotation implementations require AOP techniques; You can refer to [Jet – AOP] (git. Meiyou. Im/Android/Jet… Engineering;

Communication group:

QQ group: 547612870