'REST API'에 해당되는 글 1건

  1. 2014.10.03 AndroidStudio Gradle + AspectJ
2014.10.03 19:40

안드로이드 플젝을 하다가 반복되는 코드가 들어가야 할때가 있습니다.

예를들어 예외 처리시 다이얼로그를 띄워준다던가, 로그인 세션이 끊겼을때 다시 로그인을 시도하는등의 처리가 있는데, 로그인 세션이 끊겼을때의 경우, 


1. 서버로 리퀘스트 날림

2. 로그인 세션이 끊겨 리퀘스트가 실패(404 등등)

3. 예외를 잡고, 로그인을 시도

4-1. 성공시 다시 1 수행

4-2. 실패시 실패 다이얼로그 출력


이렇게 되는데 문제는 실패시 다시 해당 메소드를 호출해줘야 하는 문제가 있습니다.


그래서 처음 구현했을땐 각각의 리퀘스트를 날리는 메소드의 파라미터로 콜백을 줘서 처리를 했습니다.

그러다보니, 모든 코드들의 인덴테이션이 깊어 지는 현상을....



(fetcher는 rest call을 해주는 녀식입니다.)


여기서 먼저 rest call을 시도하는데, 실패하게 되면, callback의 failure 메소드를 호출해줍니다. 


그래서 미리 구현한 자동 로그인 처리 콜백을 대신 넣어주고, 이때 원래의 콜백을 생성자에 넣어 원래대로 성공시엔 원래의 콜백을, 그렇지 않고 실패시, 로그인을 시도하고 성공시 원래의 콜백을 다시 호출해 주는 형태입니다.


이것을 깔끔하게 할 방법이 없을까....하는 생각에 다이내믹 프록시를 써볼까도 생각해 봤지만 이왕 하는거 AspectJ를 사용해보기로 합니다. (다이내믹 프록시가 인터페이스에만 되는...? 이쪽은 좀 더 공부를 해봐야 할것 같아..)


stackoverflow에서 한참 뒤져보았지만... 제대로 되는게 없었는데,.,,,


https://github.com/uPhyca/gradle-android-aspectj-plugin


여기 간단하게 aspectj 를 사용할 수 있도록 해주는 플러그인이 이미 존재...허....바로 되네요...


자신의 프로젝트의 build.gradle을 아래와 같이 dependencies하고  configurations을 추가해줍니다.



build.gradle


repositories {

mavenCentral()

}


buildscript {

repositories {

mavenCentral()

}

dependencies {

classpath 'com.android.tools.build:gradle:0.12.2'

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2+'

classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+'

}

}


apply plugin: 'com.android.application'

apply plugin: 'android-aspectj'


android {

    compileSdkVersion 20

    buildToolsVersion "20.0.0"


    defaultConfig {

        applicationId "com.flask.aspectjtest"

        minSdkVersion 16

        targetSdkVersion 20

        versionCode 1

        versionName "1.0"

    }

    buildTypes {

        release {

            runProguard false

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }

    }

lintOptions {

abortOnError false

}

}


configurations {

ajc

aspects

ajInpath

}


ext.aspectjVersion = '1.8.2'


dependencies {

    compile fileTree(dir: 'libs', include: ['*.jar'])

compile 'com.android.support:appcompat-v7:20.0.0'

}



굉장히 간단하게 되는지 테스트 해보기 위해, 



간단한 어노테이션을 먼저 만들고(런타임에도 유효한 메소드에 붙일 수 있는)




관점을 만들고 @Around 어노테이션으로 메소드 실행전/후에 하고싶은것을 넣어주었습니다. 




그리고 엑티비티 클래스에서 메소드에 정의한 어노테이션을 붙여줍니다.


실행을 하면 아래와 같은 결과가 나타납니다.




AspectJ 공부: http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:fdl:aop:aspectj











저작자 표시 비영리 변경 금지
신고

'[+++ JAVA +++] > - - 작성중' 카테고리의 다른 글

AndroidStudio with Robolectric  (0) 2014.12.02
AndroidStudio Gradle + AspectJ  (0) 2014.10.03
AngularJs - 2  (0) 2014.08.05
Mocha - Javascript test framework  (0) 2014.07.23
Trackback 0 Comment 0


티스토리 툴바