0
반복적인 작업이 싫은 안드로이드 개발자에게                 @geekbeast                     진성주
발표자 소개         진성주 ( @geekbeast )         Blog : http://softwaregeeks.org         안드로이드 프로그래밍         : 제대로 된 안드로이드 앱 개발을 ...
http://www.hanb.co.kr/network/view.html?bi_id=981
Motivation
Motivation
Motivation짜증나는 안드로이드 반복적인 작업 1. UI 매핑 (findViewById) 2. 파라미터 처리 (getIntent().getExtras()…) 3. 비동기처리 (Async) 4. REST 통신 ( H...
Motivation1. UI 매핑TextView subject = (TextView) findViewById(R.id.subject);TextView writer = (TextView) findViewById(R.id....
Motivation 2. 파라미터 처리 String id = intent.getStringExtra("id"); String name = intent.getStringExtra(“name"); String nicknam...
Motivation3. 비동기처리 (Async)private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {@Background  protected Lo...
Motivation4. REST 통신private InputStream download(String url) {@Restpublic interface DaumMovieService {       HttpURLConnec...
목표         반복적인 코드를 줄일 수 있는오픈소스(RoboGuice, AndroidAnnotations) 써보세요~
Contents 목차 1. Reflection, Annotation 2. 오픈소스   1. Dependency Injection Framework : RoboGuice   2. Annotation Process Tool...
Contents 목차 1. Reflection, Annotation 2. 오픈소스   1. Dependency Injection Framework : RoboGuice   2. Annotation Process Tool...
01 Reflection, Annotation Reflection 1.   (거울 등에 비친) 상 2.   (빛・열・소리 등의) 반사, 반향 3.   (상태・속성 등의) 반영       클래스 모습을 자신이 볼 수 있고...
01 Reflection, Annotation 이클립스 자동완성 (Ctrl+Space)
01 Reflection, Annotation JDBC Programming… Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverMana...
01 Reflection, Annotation 웹 어플리케이션 web.xml <servlet> <servlet-name>action</servlet-name> <servlet-class>      org.software...
01 Reflection, Annotation 스프링프레임워크 ApplicationContext.xml <bean id="MessageDao" class="org.softwaregeeks.nateon.MessageDao...
01 Reflection, Annotation              Java Complier               javac     *.java                   *.class
01 Reflection, Annotation                *.class          Java Virtual Machine
01 Reflection, Annotation      JVM Internal - http://helloworld.naver.com/index.php?vid=helloworld&document_srl=1230
01 Reflection, Annotation java.lang.relect.*
01 Reflection, Annotation 클래스 public class Person {     private String name;     private int age;     private Sex sex;    ...
01 Reflection, Annotation 클래스 필드 가져오기 Class clz = Person.class; Field[] fields = clz.getDeclaredFields(); for(Field field ...
01 Reflection, Annotation 클래스 메소드 가져오기 Class clz = Person.class; Method[] methods = clz.getDeclaredMethods(); for(Method m...
01 Reflection, Annotation
01 Reflection, Annotation Annotation 1.   주석(을 달기)
01 Reflection, Annotation 만드는법 @Target @Retention public @interface 이름{     String value(); }
01 Reflection, Annotation ElementType package java.lang.annotation; public enum ElementType {     TYPE,                 //...
01 Reflection, Annotation Retention package java.lang.annotation; public enum RetentionPolicy {     SOURCE,        // Anno...
01 Reflection, Annotation 어노테이션 만들기 @Retention(RetentionPolicy.RUNTIME) public @interface Description {     String value()...
01 Reflection, Annotation 어노테이션 만들기public class Person {  @Description(value="이름이예요.")  private String name;  @Description...
01 Reflection, Annotation 어노테이션 가져오기 Class clz = Person.class; for(Field field : fields) {     Annotation[] annotations = ...
01 Reflection, Annotation
01 Reflection, Annotation @ViewById TextView subject; @ViewById TextView write; @ViewById TextView date @ViewById TextView...
01 Reflection, Annotation        스크린캐스트 자료 제공        http://goo.gl/EgAAU
Contents 목차 1. Reflection, Annotation 2. 오픈소스   1. Dependency Injection Framework : RoboGuice   2. Annotation Process Tool...
Contents 목차 1. Reflection, Annotation 2. 오픈소스   1. Dependency Injection Framework : RoboGuice   2. Annotation Process Tool...
02   오픈소스 - Dependency Injection Framework : RoboGuice                    Google Guice on Android Project!!               ...
02   오픈소스 - Dependency Injection Framework : RoboGuice                    RoboGuice                 Google Guice          ...
02   오픈소스 - Dependency Injection Framework : RoboGuice
02   오픈소스 - Dependency Injection Framework : RoboGuice class RoboWay extends RoboActivity { class AndroidWay extends Activ...
02   오픈소스 - Dependency Injection Framework : RoboGuice RoboGuice 기능•    기본 클래스 Inject 가능•    로깅기능       릴리즈 시 자동으로 디버그 메시지...
02      오픈소스 - Dependency Injection Framework : RoboGuice RoboGuice 기능•       RoboAsyncTask          기본적인 AsyncTask를 확장하고 ...
02   오픈소스 - Dependency Injection Framework : RoboGuice               Custom Class Inject
02   오픈소스 - Dependency Injection Framework : RoboGuice                                  Application                       ...
02   오픈소스 - Dependency Injection Framework : RoboGuice                   RoboGuice 2.0 beta3 에서는 XML 파일을 이용한              ...
02   오픈소스 - Dependency Injection Framework : RoboGuice                           Reverse Engineering                      ...
02   오픈소스 - Dependency Injection Framework : RoboGuice
02   오픈소스 - Dependency Injection Framework : RoboGuice
02   오픈소스 - Dependency Injection Framework : RoboGuice
02   오픈소스 - Dependency Injection Framework : RoboGuice RoboGuice 장단점•    장점1.   Dependency Injection Framework 인 Google Gu...
Contents 목차 1. Reflection, Annotation 2. 안드로이드에 Reflection, Annotation 적용해보기 3. 오픈소스   1. Dependency Injection Framework :...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations                           androidannotations         https...
02       오픈소스 - Annotation Process Tool Library : AndroidAnnoations@EActivity(R.layout.translate)public class TranslateAct...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations                      RoboGuice 와 다르게                      ...
02        오픈소스 - Annotation Process Tool Library : AndroidAnnoations// DO NOT EDIT THIS FILE, IT HAS BEEN GENERATED USING ...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations        APT(Annotation Process Tool)     JSR 269(JSR 269 Pl...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations                 AndroidAnnotations           ClassA.java를 ...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations AndroidAnnoations 기능Cookbook - https://github.com/excilys/...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations AndroidAnnoations 기능•    Extras : @Extra•    SystemService...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations            Click Event, Background
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations                        REST API     AndroidAnnoations + Sp...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations                      AndroidAnnotations                   ...
02       오픈소스 - Annotation Process Tool Library : AndroidAnnoationsSpring AndroidHttpHeaders requestHeaders = new HttpHead...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoationsAndroidAnnotations REST API @Rest public interface DaumMovi...
02   오픈소스 - Annotation Process Tool Library : AndroidAnnoations AndroidAnnoations 장단점•    장점1.   Annotation Process Tool 이...
02   오픈소스 - RoboGuice + AndroidAnnotations                      RoboGuice                  AndroidAnnotations          실제 ...
02   오픈소스 - RoboGuice + AndroidAnnotations             RoboGuice + AndroidAnnotations              https://github.com/exci...
Motivation짜증나는 안드로이드 반복적인 작업 1. UI 매핑 (findViewById) 2. 파라미터 처리 (getIntent().getExtras()….) 3. 비동기처리 (Async) 4. REST 통신 ( ...
Contents 목차 1. Reflection, Annotation 2. 오픈소스   1. Dependency Injection Framework : RoboGuice   2. Annotation Process Tool...
03   오픈소스를 넘어… UI Mapping private TextView hello1; private TextView hello2; private TextView hello3; private TextView hell...
03   오픈소스를 넘어… 직접 내가 한번 만들어보자. @ViewById TextView subject; @ViewById TextView write; @ViewById TextView date @ViewById Tex...
03   오픈소스를 넘어… UI Mapping 반복적인 작업 줄이기 ; Reflection 사용하기 1. Reflection으로 액티비티에 선언된 필드 리스트     가져오기 2. 필드명으로 리소스 identifier ...
03     오픈소스를 넘어…public static void mappingViews(Object object) { Activity activity = (Activity)object; Field[] fields = ac...
03   오픈소스를 넘어… UI Mapping 반복적인 작업 줄이기 ; Reflection + Custom Annotation 사용하기 1. Custom Annotation 만들기 ( InjectView ) 2. 필드에...
03   오픈소스를 넘어…1. 어노테이션 만들기@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface InjectView {  int...
03   오픈소스를 넘어…2. 어노테이션 값 가져오기InjectView injectView =field.getAnnotation(InjectView.class);if( injectView == null )   conti...
Contents 목차 1. Reflection, Annotation 2. 오픈소스   1. Dependency Injection Framework : RoboGuice   2. Annotation Process Tool...
Intent                  목표          반복적인 코드를 줄일 수 있는      자바의 리플렉션, 어노테이션을 이해하고 오픈소스(RoboGuice, AndroidAnnotations)를 활용하여 ...
Q&A질의응답Twitter : http://twitter.com/geekbeastMail : moleskine7@gmail.comBlog : http://softwaregeeks.org
Thank you!:D
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
Upcoming SlideShare
Loading in...5
×

반복적인 작업이 싫은 안드로이드 개발자에게

15,683

Published on

갑을병정 산업구조에서 갑돌이의 잦은 요구사항 변경 통보를 받아보셨을 겁니다. 사람들에게 받은 스트레스를 풀려고 '그래! 난 개발자닌깐' 하고 자리에 앉아서 코드를 짜는데 반복적인 작업을 하다보면 ‘내가 이걸 왜 하고 있나’ 라는 생각까지 들기도 합니다.

안드로이드 작업을 하다보면 다음과 같은 반복적인 작업을 하는 것을 느꼈을 겁니다.

반복적인 보일러(Boiler)코드를 줄일 수 있는 오픈소스를 소개하고자 합니다.

Published in: Technology, Education
0 Comments
49 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
15,683
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
174
Comments
0
Likes
49
Embeds 0
No embeds

No notes for slide

Transcript of "반복적인 작업이 싫은 안드로이드 개발자에게"

  1. 1. 반복적인 작업이 싫은 안드로이드 개발자에게 @geekbeast 진성주
  2. 2. 발표자 소개 진성주 ( @geekbeast ) Blog : http://softwaregeeks.org 안드로이드 프로그래밍 : 제대로 된 안드로이드 앱 개발을 위한 진성주,최종열,백정현,신중훈(공저)
  3. 3. http://www.hanb.co.kr/network/view.html?bi_id=981
  4. 4. Motivation
  5. 5. Motivation
  6. 6. Motivation짜증나는 안드로이드 반복적인 작업 1. UI 매핑 (findViewById) 2. 파라미터 처리 (getIntent().getExtras()…) 3. 비동기처리 (Async) 4. REST 통신 ( Http )
  7. 7. Motivation1. UI 매핑TextView subject = (TextView) findViewById(R.id.subject);TextView writer = (TextView) findViewById(R.id.writer);TextView date = (TextView) findViewById(R.id.date);TextView hit = (TextView) findViewById(R.id.hit);@ViewByIdTextView subject;@ViewByIdTextView write;@ViewByIdTextView date@ViewByIdTextView hit;
  8. 8. Motivation 2. 파라미터 처리 String id = intent.getStringExtra("id"); String name = intent.getStringExtra(“name"); String nickname = intent.getStringExtra(“nickname"); Int sex = intent.getIntExtra(“sex“,0); Object object = intent.getExtras().get("object");@Extra(“id") String id;@Extra(“name") String name;@Extra(“nickname") String nickname;@Extra(“sex") int sex;@Extra(“object") Object object;
  9. 9. Motivation3. 비동기처리 (Async)private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {@Background protected Long doInBackground(URL... urls) {void backgroudJob() { MovieContentsurls.length; int count = movieContents = daumMovieService.getMovieContents("love"); long totalSize = 0; String result = movieContents.getQuery(); setData(result); i < count; i++) { for (int i = 0;} totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); }@UiThread return totalSize;void setData(String data) { } textView.setText(data);} protected void onProgressUpdate(Integer... progress) {
  10. 10. Motivation4. REST 통신private InputStream download(String url) {@Restpublic interface DaumMovieService { HttpURLConnection con = null; @Get("http://apis.daum.net/contents/movie?apikey=DAUM_CONTENTS_DEMO_APIKEY&output= URL url; xml&q={query}") InputStream is=null; public MovieContents getMovieContents(String query); try {} url = new URL(url); con = (HttpURLConnection) url.openConnection(); con.setReadTimeout(10000 /* milliseconds */); con.setConnectTimeout(15000 /* milliseconds */); con.setRequestMethod("GET"); con.setDoInput(true);
  11. 11. 목표 반복적인 코드를 줄일 수 있는오픈소스(RoboGuice, AndroidAnnotations) 써보세요~
  12. 12. Contents 목차 1. Reflection, Annotation 2. 오픈소스 1. Dependency Injection Framework : RoboGuice 2. Annotation Process Tool Library: AndroidAnnoations 3. 오픈소스를 넘어… 4. 정리
  13. 13. Contents 목차 1. Reflection, Annotation 2. 오픈소스 1. Dependency Injection Framework : RoboGuice 2. Annotation Process Tool Library: AndroidAnnoations 3. 오픈소스를 넘어… 4. 정리
  14. 14. 01 Reflection, Annotation Reflection 1. (거울 등에 비친) 상 2. (빛・열・소리 등의) 반사, 반향 3. (상태・속성 등의) 반영 클래스 모습을 자신이 볼 수 있고, 수정할 수 도 있는 기술
  15. 15. 01 Reflection, Annotation 이클립스 자동완성 (Ctrl+Space)
  16. 16. 01 Reflection, Annotation JDBC Programming… Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(
  17. 17. 01 Reflection, Annotation 웹 어플리케이션 web.xml <servlet> <servlet-name>action</servlet-name> <servlet-class> org.softwaregeeks.Servlet </servlet-class> </ servlet>
  18. 18. 01 Reflection, Annotation 스프링프레임워크 ApplicationContext.xml <bean id="MessageDao" class="org.softwaregeeks.nateon.MessageDao"/> <bean id="NateOn" class="org.softwaregeeks.nateon.NateOn">
  19. 19. 01 Reflection, Annotation Java Complier javac *.java *.class
  20. 20. 01 Reflection, Annotation *.class Java Virtual Machine
  21. 21. 01 Reflection, Annotation JVM Internal - http://helloworld.naver.com/index.php?vid=helloworld&document_srl=1230
  22. 22. 01 Reflection, Annotation java.lang.relect.*
  23. 23. 01 Reflection, Annotation 클래스 public class Person { private String name; private int age; private Sex sex; ……… // Setter, Getter… ………
  24. 24. 01 Reflection, Annotation 클래스 필드 가져오기 Class clz = Person.class; Field[] fields = clz.getDeclaredFields(); for(Field field : fields) { System.out.println(field.getName()); }
  25. 25. 01 Reflection, Annotation 클래스 메소드 가져오기 Class clz = Person.class; Method[] methods = clz.getDeclaredMethods(); for(Method method : methods) { System.out.println(method.getName()); }
  26. 26. 01 Reflection, Annotation
  27. 27. 01 Reflection, Annotation Annotation 1. 주석(을 달기)
  28. 28. 01 Reflection, Annotation 만드는법 @Target @Retention public @interface 이름{ String value(); }
  29. 29. 01 Reflection, Annotation ElementType package java.lang.annotation; public enum ElementType { TYPE, // Class, interface, or enum (but not annotation) FIELD, // Field (including enumerated values) METHOD, // Method (does not include constructors) PARAMETER, // Method parameter CONSTRUCTOR, // Constructor LOCAL_VARIABLE, // Local variable or catch clause ANNOTATION_TYPE, // Annotation Types (meta-annotations) PACKAGE // Java package }
  30. 30. 01 Reflection, Annotation Retention package java.lang.annotation; public enum RetentionPolicy { SOURCE, // Annotation is discarded by the compiler CLASS, // Annotation is stored in the class file, but ignored by the VM RUNTIME // Annotation is stored in the class file and read by the VM }
  31. 31. 01 Reflection, Annotation 어노테이션 만들기 @Retention(RetentionPolicy.RUNTIME) public @interface Description { String value(); }
  32. 32. 01 Reflection, Annotation 어노테이션 만들기public class Person { @Description(value="이름이예요.") private String name; @Description(value="나이예요.") private int age; @Description(value="성별입니다.") private Sex sex;
  33. 33. 01 Reflection, Annotation 어노테이션 가져오기 Class clz = Person.class; for(Field field : fields) { Annotation[] annotations = field.getDeclaredAnnotations(); for(Annotation annotation : annotations) { if( annotation instanceof Description ) { Description description = (Description)annotation; System.out.println(description.value()); } } }
  34. 34. 01 Reflection, Annotation
  35. 35. 01 Reflection, Annotation @ViewById TextView subject; @ViewById TextView write; @ViewById TextView date @ViewById TextView hit;
  36. 36. 01 Reflection, Annotation 스크린캐스트 자료 제공 http://goo.gl/EgAAU
  37. 37. Contents 목차 1. Reflection, Annotation 2. 오픈소스 1. Dependency Injection Framework : RoboGuice 2. Annotation Process Tool Library: AndroidAnnoations 3. 오픈소스를 넘어… 4. 정리
  38. 38. Contents 목차 1. Reflection, Annotation 2. 오픈소스 1. Dependency Injection Framework : RoboGuice 2. Annotation Process Tool Library: AndroidAnnoations 3. 오픈소스를 넘어… 4. 정리
  39. 39. 02 오픈소스 - Dependency Injection Framework : RoboGuice Google Guice on Android Project!! http://code.google.com/p/roboguice/
  40. 40. 02 오픈소스 - Dependency Injection Framework : RoboGuice RoboGuice Google Guice Google Guice on Android Project!! a lightweight dependency injection framework for Java 5 and above, brought to you by Google.
  41. 41. 02 오픈소스 - Dependency Injection Framework : RoboGuice
  42. 42. 02 오픈소스 - Dependency Injection Framework : RoboGuice class RoboWay extends RoboActivity { class AndroidWay extends Activity { TextView name; @InjectView(R.id.name) TextView name; ImageView thumbnail; @InjectView(R.id.thumbnail) ImageView thumbnail; LocationManager loc; @InjectResource(R.drawable.icon) Drawable icon; Drawable icon; @InjectResource(R.string.app_name) String myName; String myName; @Inject LocationManager loc; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.main); super.onCreate(savedInstanceState); name = (TextView) findViewById(R.id.name); setContentView(R.layout.main); thumbnail = (ImageView) findViewById(R.id.thumbnail); name.setText( "Hello, " + myName ); loc = (LocationManager) getSystemService(Activity.LOCATION_SERVICE); } icon = getResources().getDrawable(R.drawable.icon); }
  43. 43. 02 오픈소스 - Dependency Injection Framework : RoboGuice RoboGuice 기능• 기본 클래스 Inject 가능• 로깅기능 릴리즈 시 자동으로 디버그 메시지 제거 앱정보(앱이름, 로그메세지 라인, TimeStamp, Thread, 다른 유용한 정보 )들이 자동으로 로깅 됨
  44. 44. 02 오픈소스 - Dependency Injection Framework : RoboGuice RoboGuice 기능• RoboAsyncTask 기본적인 AsyncTask를 확장하고 onException(), onFinally() 통해서 에러처리 가능• Event handlers OnActivityResultEvent , OnConfigurationChangedEvent, OnContentChangedEvent, OnContentViewAvailableEvent OnCreateEvent, OnDestroyEvent 등 많은 이벤트를 받을 수 있도록 어노테이션 지원 ※ RoboGuice 2.0 beta3 에서는 더 많은 기능이 추가 됨 • Support for Fragments • RoboApplication 에서 모듈추가를 하지 않고, res/values/roboguice.xml 외부파일로 모듈을 추가할 수 있음 • Guice 3.0 and Maven 2.0 and 3.0 support
  45. 45. 02 오픈소스 - Dependency Injection Framework : RoboGuice Custom Class Inject
  46. 46. 02 오픈소스 - Dependency Injection Framework : RoboGuice Application RoboApplication addApplicationModules AbstractModule AbstractModule AbstractModule MyModule MyModule … MyModule configure configure configure bind(CustomClass.class) bind(CustomClass.class) bind(CustomClass.class)
  47. 47. 02 오픈소스 - Dependency Injection Framework : RoboGuice RoboGuice 2.0 beta3 에서는 XML 파일을 이용한 Custom Class Injection 가능
  48. 48. 02 오픈소스 - Dependency Injection Framework : RoboGuice Reverse Engineering http://goo.gl/h4X4H
  49. 49. 02 오픈소스 - Dependency Injection Framework : RoboGuice
  50. 50. 02 오픈소스 - Dependency Injection Framework : RoboGuice
  51. 51. 02 오픈소스 - Dependency Injection Framework : RoboGuice
  52. 52. 02 오픈소스 - Dependency Injection Framework : RoboGuice RoboGuice 장단점• 장점1. Dependency Injection Framework 인 Google Guice를 Android 에서 사용할 수 있다.2. 다양한 어노테이션과 기본 클래스들을 사용하여 코드를 줄일 수 있음• 단점1. 라이브러리 용량문제(guice-2.0-no_aop + roboguice1.1.2 = 533KB) Making Your App Smaller - http://code.google.com/p/roboguice/wiki/ProGuard2. 런타임 리플렉션 사용으로 인한 성능저하
  53. 53. Contents 목차 1. Reflection, Annotation 2. 안드로이드에 Reflection, Annotation 적용해보기 3. 오픈소스 1. Dependency Injection Framework : RoboGuice 2. Annotation Process Tool Library: AndroidAnnoations
  54. 54. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations androidannotations https://github.com/excilys/androidannotations
  55. 55. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations@EActivity(R.layout.translate)public class TranslateActivity extends Activity { @ViewById EditText textInput; @AnimationRes Animation faceIn; @Click void doTranslate() { translateInBackground(textInput.getText().toString()); } @Background void translateInBackground(String textToTranslate) { String translatedText = callGoogleTranslate(textToTranslate); showResult(translatedText); }
  56. 56. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations RoboGuice 와 다르게 AndroidAnnoations 런타임이 아니라 컴파일 시, 모든 소스를 자동으로 생성함.
  57. 57. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations// DO NOT EDIT THIS FILE, IT HAS BEEN GENERATED USING AndroidAnnotations.public final class TranslateActivity_ extends TranslateActivity{ @Override public void onCreate(Bundle savedInstanceState) { beforeCreate_(savedInstanceState); super.onCreate(savedInstanceState); setContentView(layout.main); } private void beforeCreate_(Bundle savedInstanceState) { } private void afterSetContentView_() { textView = ((TextView) findViewById(id.textView)); ……
  58. 58. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations APT(Annotation Process Tool) JSR 269(JSR 269 Pluggable Annotation Processing API) Annotation을 사용하여 소스 컴파일 전에 사용자가 원한는 작업을 할 수 있도록 하는 규격 Annotation Compiler Source Code Class file Process Tool
  59. 59. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations AndroidAnnotations ClassA.java를 Annotation Process Tool API를 통해 ClassA_.java 파일을 생성하여 처리한다. 1. AndroidManifest.xml 해당 액티비티명 + “_” 추가 2. Intent를 사용시에 작성한 액티비티명 + “_”를 추가하여야 함
  60. 60. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations AndroidAnnoations 기능Cookbook - https://github.com/excilys/androidannotations/wiki/Cookbook• Activities : @EActivity• Application : @App• View : @ViewById, @AfterViews• Resource : @StringRes, @ColorRes, @AnimationRes @BooleanRes @ColorStateListRes @DimensionRes @DimensionPixelOffsetRes @DimensionPixelSizeRes @DrawableRes @IntArrayRes @IntegerRes @LayoutRes @MovieRes @TextRes @TextArrayRes @StringArrayRes
  61. 61. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations AndroidAnnoations 기능• Extras : @Extra• SystemServices : @SystemService• Injecting html : @HtmlRes, @FromHtml• WorkingWithThreads : @Background, @UiThread, @UiThreadDelayed• HandlingEvents : @Click, @LongClick, @Touch, @ItemClick, @LongItemClick, @ItemSelect• Handling options menu : @OptionsMenu, @OptionsItem• REST API(With SpringAndroid) : @Rest, @RestService, @Get, @Put, @Post, @Delete, @Options, @Head, @ Accept• Trace Method Execution : @Trace
  62. 62. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations Click Event, Background
  63. 63. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations REST API AndroidAnnoations + SpringAndroid
  64. 64. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations AndroidAnnotations Spring Android (core, RestTemplate) Jackson(JSON), Simpleframework(XML) Mashaller
  65. 65. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoationsSpring AndroidHttpHeaders requestHeaders = new HttpHeaders();requestHeaders.setAccept(Collections.singletonList(new MediaType("application","json")));HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);String url = "http://mypretendservice.com/events";RestTemplate restTemplate = new RestTemplate();ResponseEntity<Event[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, Event[].class );Event[] events = responseEntity.getBody();
  66. 66. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoationsAndroidAnnotations REST API @Rest public interface DaumMovieService { @Get("http://apis.daum.net/contents/movie?apikey=DAUM_C ONTENTS_DEMO_APIKEY&output=xml&q={query}") public MovieContents getMovieContents(String query); } // 실제 액티비티나 서비스에서 사용시, @RestService DaumMovieService daumMovieService;
  67. 67. 02 오픈소스 - Annotation Process Tool Library : AndroidAnnoations AndroidAnnoations 장단점• 장점1. Annotation Process Tool 이용하여 컴파일 시에 모든 코드가 생성되어 성능상 이점이 있다. (런타임 시 리플렉션을 사용하지 않음)2. 다양한 커스텀 어노테이션이 제공됨• 단점1. 인텐트를 사용시 “_” 문자열 처리
  68. 68. 02 오픈소스 - RoboGuice + AndroidAnnotations RoboGuice AndroidAnnotations 실제 두 프로젝트는 유사한 점이 있는데 AndroidAnnotations 커미터가 RoboGuice 컨트리뷰터로 참여하고 있음 두 프로젝트는 경쟁관계라기보다 상호보완적인 관계
  69. 69. 02 오픈소스 - RoboGuice + AndroidAnnotations RoboGuice + AndroidAnnotations https://github.com/excilys/androidannotations/wiki/RoboGuiceIntegration
  70. 70. Motivation짜증나는 안드로이드 반복적인 작업 1. UI 매핑 (findViewById) 2. 파라미터 처리 (getIntent().getExtras()….) 3. 비동기처리 (Async) 4. REST 통신 ( Http )
  71. 71. Contents 목차 1. Reflection, Annotation 2. 오픈소스 1. Dependency Injection Framework : RoboGuice 2. Annotation Process Tool Library: AndroidAnnoations 3. 오픈소스를 넘어… 4. 정리
  72. 72. 03 오픈소스를 넘어… UI Mapping private TextView hello1; private TextView hello2; private TextView hello3; private TextView hello4; private TextView hello5; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); hello1 = (TextView)findViewById(R.string.hello1); hello2 = (TextView)findViewById(R.string.hello2); hello3 = (TextView)findViewById(R.string.hello3); hello4 = (TextView)findViewById(R.string.hello4); hello5 = (TextView)findViewById(R.string.hello5);
  73. 73. 03 오픈소스를 넘어… 직접 내가 한번 만들어보자. @ViewById TextView subject; @ViewById TextView write; @ViewById TextView date @ViewById TextView hit;
  74. 74. 03 오픈소스를 넘어… UI Mapping 반복적인 작업 줄이기 ; Reflection 사용하기 1. Reflection으로 액티비티에 선언된 필드 리스트 가져오기 2. 필드명으로 리소스 identifier 값(R.id.xxxxxx)을 가져오기 3. findViewById(R.id.xxxxx) 으로 View 가져오기 4. Reflection으로 필드에 View Injection
  75. 75. 03 오픈소스를 넘어…public static void mappingViews(Object object) { Activity activity = (Activity)object; Field[] fields = activity.getClass().getDeclaredFields(); for (Field field : fields) { String identifierString = field.getName(); int identifier = activity.getResources().getIdentifier(identifierString, "id", activity.getPackageName()); if( identifier == 0 ) {continue; } View findedView = activity.findViewById(identifier); if( findedView == null ) { continue; } if( findedView.getClass() == field.getType() ) { try { field.setAccessible(true); field.set(object, findedView);
  76. 76. 03 오픈소스를 넘어… UI Mapping 반복적인 작업 줄이기 ; Reflection + Custom Annotation 사용하기 1. Custom Annotation 만들기 ( InjectView ) 2. 필드에서 어노테이션 가져와서 처리 3. BaseActivity 만들어 상속구조로 간소화하기
  77. 77. 03 오픈소스를 넘어…1. 어노테이션 만들기@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface InjectView { int id() default 0;}
  78. 78. 03 오픈소스를 넘어…2. 어노테이션 값 가져오기InjectView injectView =field.getAnnotation(InjectView.class);if( injectView == null ) continue;int identifier = injectView.id();
  79. 79. Contents 목차 1. Reflection, Annotation 2. 오픈소스 1. Dependency Injection Framework : RoboGuice 2. Annotation Process Tool Library: AndroidAnnoations 3. 오픈소스를 넘어… 4. 정리
  80. 80. Intent 목표 반복적인 코드를 줄일 수 있는 자바의 리플렉션, 어노테이션을 이해하고 오픈소스(RoboGuice, AndroidAnnotations)를 활용하여 작업능률을 높이자!!!
  81. 81. Q&A질의응답Twitter : http://twitter.com/geekbeastMail : moleskine7@gmail.comBlog : http://softwaregeeks.org
  82. 82. Thank you!:D
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×