SlideShare ist ein Scribd-Unternehmen logo
1 von 285
안드로이드 오픈소스
어플리케이션 블럭
NHNNEXT
손영수
KTH
진성
주
말랑 스튜디오
(김영호, 강진석)
Filpboard 팀 ligbuf 팀
SW 아키텍트 포럼
모바일 분과 fHalo 팀
Logdog 팀
Thanks to..
Google이
꿈꾸는..
Android의 미래
Google은
왜 modu의 특허를 50억에 샀을까?
modu의 Jacket 시스템
이게
왜 중요하지?..
236676
546050
1162950
2197563
3805989
6253991
2010 2011 2012 2013 2014 2015
갈수록 증가하는 모바일 Traffic
단위 TB/월Cisco (2012), Cisco Visual Networking Index
사실 Google의
서비스는 Cloud에..
Android는 Google의 서비스를
(개인, 가정이) 소비하게 만드는 Hub
0.00
50,000.00
100,000.00
150,000.00
3Q 2012
3Q 2011
Android iOS RIM Bada Symbian Microsoft Others
Gartner Smartphone M/S- http://on.mash.to/TW5EAA
시장 점유율 (52% -> 72%)
또한…
Android는
더 이상
Gadget을 위한
OS가 아니다.
Embedded
System을
포괄할 OS로 봐야 함.
하지만..
제조사 입장에서
Android는
독이 든 성배..
23
58 58 61
65 68 71
84
Openness
Android Qt Symbian Meego
Mozilla Webkit Linux Eclipse
안드로이드의 개방
성
Vision Mobile Report July, 2011- http://bit.ly/oTmEmF
오픈 소스 이긴 한데..
구글러가 아니면 할수 있는게 없다…
정리하면..
버그만 잡아줘..
어플리케이션 블럭이
Android Application Block
UI
Network
Common
BaaS
UI BindingUI Pattern HybridActionbar
(Un)Marshller + Dispatcher(Un)Marshaller SNS
DILogging Lightweight DI
User Log +
Crash Log
User Behavior Open Source BaaSNotification
Android의 단점을
극복할 대체제들을 잘써야 한다.
UI
Network
Common
BaaS
android-binding android-actionbar actionbar shelock android ui
patterns
gson (json)
Simple
(REST)
Facebook (fhalo)
Android billing
(In app purchase)
roboguice
USERGRID
(BaaS Open Source)
microlog
4android
sensing
User Behavior
Analytics LogDog
Volley
Welcome to my Journey!
Part I. UI Layer
UI
Network
Common
BaaS
UI BindingUI Pattern HybridActionbar
(Un)Marshller + Dispatcher(Un)Marshaller SNS
DILogging Lightweight DI
LoggingUser Behavior
Open Source Bas
s
Notification
Architecture
Visualization
높이 (30000 feet)봐야 할까?
뭐가 보이시나요??
자세히
(0 feet) 봐야 할
까?
제한된 코드로 프로젝트가
잘되고 있는지 판단은?
3만 피트 vs 0 피트의 뷰.
3만 피트
• 다이어그램의 Line의 의미는?
• 의존성?
• 데이터 흐름?
• 버스와 같은 공유자원?
0 피트
• 너무 상세한 정보임.
• 전체적인 구조를 보지 못함.
해결책은..
적절한 1000 피트의 뷰
STAN (Structure Analysis for Java)
STAN - http://stan4j.com/eclipse/eclipse-integration.html
Robert C. Martin의 그래프
Instability
•패키지의 움직일 수 있는 여력을 판단하는
지표
•다른 패키지에 영향을 미치지 않고,
해당 패키지를 쉽게 변경 할 수 있는가?
•Instability I = Ce / (Ca+Ce)
•Ce = Efferent Coupling (Ingoing Dependencies)
•Ca = Afferent Coupling (Outgoing Dependencies )
Instability
Instability I = Ce / (Ca+Ce)
당신의 패키지가 다른 사람이 많이 쓴다면,
즉 Outgoing, Ca가 많다면, 여러분의 패키지는 변경하기 어렵다.
반대로 Outgoing하는 Ca가 적고, Ingoing(다른 패키지만 사용만 하는) Ce,
여러분의 패키지는 쉽게 변경해도 된다.
즉 0.0에서 0.3이면 안정적인 버전, 0.7에서 1.0이면 불안정적인 상태다
Abstractness
Interface(Abstract) 와 Concrete Class를 비교
A = (#abstract classes / total # of classes)
•Abstract class = interface, abstract다 포함
•Total # class = abstract class + concrete class
•0 이면 concrete class만 있다.
•1 이면 abstract class만 있다.
다시 보는 그래프
다른데서 많이 쓰는
녀석이니 조금 더
abstract를 높여야
돼!
그 외 용어
•Tangled Complexity
•순환 참조가 있어 Boundary를 깰 때
•Cyclomatic Complexity
•분기 문이 많아 hotspot이 될 가망성이 높은 곳
경고!!!
경고!!!
환자의 외부 증상만
고치는 의사가 되지 말자!!
이러한 정보는 좋은 가이드일뿐!!
숫자에 의존하다가
오히려 문제가 보이지 않게 된다.
1장. UI Patterns
http://bit.ly/QyDjMV
다양한 안드로이드 UI 오픈소스들을 소
개
http://bit.ly/cOzoD2
안드로이드 ScreenCast
단편화
+
고급적인 효과..
Android UI Patterns App
Android UI Patterns App
2장. Actionbar
스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
colors.xml
스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
3장.
Binding Framework
http://code.google.com/p/android-binding/
http://bit.ly/cxxwCF
Model View
Presentation
Model
(ViewModel)
DataBinding
MVVM
DataBinding
Function Call
Model View
ViewModel
DataBinding
MVVM in Android Binding
DataBinding
Function Call
데이터
상태정보
처리로직
Layout.xml
Code-Behind
Event에 대한 Binding
다음과 같이 버튼에 대한 이벤트
Method OnClick()
Main.xml
CalculateViewModel.java
Option.xml
Main Activity
Main Activity
4장.
Hybrid Framework
???
Native
Web
130만 명의 아침을 깨운 „알람몬‟
- 다양한 알람몬들과 Game으로 시작하는 즐거운 아침!
- 모든 해상도 대응
- 한국어, 일본어, 영어, 중국어 지원
320x480, 480x800, 540x960,768x1024
720x1280,
800x1280
1600x2560
Resolution
해상도 파편화 문제!!
Cocos2D적용 전
Xml 레이아웃 3종류 만들기
- layout-hdpi : 갤럭시 S2
- layout-xhdpi : 갤럭시 S3, 갤럭시 노트
- layout-xlarge-mdpi : 갤럭시 노트 10.1
Drawable 폴더 2종류 만들기
- drawable-hdpi : 800*480용 이미지
- drawable-xhdpi : 1280*800, 1280*720용 이미지
갤럭시 탭 10.1인치 갤럭시 S2 4.3인치
1. 기기 화면 크기에 따른 문제!!
COCOS 2D 엔진으로 자동 스케일링
갤럭시 탭 10.1인치 갤럭시 S2 4.3인치
COCOS2D 게임 엔진을 이용하여 자동 스케일링 후 나머지 부분 Crop
갤럭시 노트
16:10 (1280*800)
2. 기기 해상도에 따른 문제!!
갤럭시 S3
16:9 (1280*720)
옵티머스 뷰
4:3 (1024*768)
Cocos2D 사용 시...
- Cocos2D로 UI를 나타낼 View 설정
- Handler 객체 전달하여 Activity와 통신
- Activity Context 전달
- String Resurce 가져오기
- 진동, 전화 등과 같이 안드로이드 시스템 서비스
사용시
3. 언어별 글자 길이 문제
한국어 : 배고픈 양에게 먹이를 주세요!
중국어 : 主人,放飯的時間到了!
일본어 : たいへん、ひつじが腹ペコ!
餌を与えて
영어 : Feed the hungry sheep !
Custom TextView
• 글자 길이가 지정된 길이를 초과한다면 지정된 길이를 초과하지 않도
록 폰트 사이즈 조절
• 문자열에 개행(n) 문자가 있다면 문자열들을 개행 문자 기준으로 나
눈뒤 가장 긴 부분 기준으로 폰트 사이즈 조절
• 설정된 텍스트 뷰 길이 기준으로 원하는 비율이 문자열의 최대 길이
가 될수 있도록 폰트 사이즈 조절
Custom TextView
개행 기준
가장 긴 문자열
Custom TextView
원래 크기
TextView 기준 80% 길이 조정
<RelativeLayout android:layout_width=" wrap_content“
android:layout_height="wrap_content" >
<ImageView android:id="@+id/imageView1"
android:src="@drawable/ah_send_error2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.malangstudio.alarmmon.util.ResizeTextView
android:layout_width="match_parent"
android:layout_height="match_parent" android:gravity="center“
android:layout_alignBottom="@id/imageView1"
android:layout_alignLeft="@id/imageView1"
android:layout_alignRight="@id/imageView1"
android:layout_alignTop="@id/imageView1"
minTextSize=“10” android:textSize="15sp“
widthPercent=“80” android:text="@string/SendError_Title“/>
</RelativeLayout>
원하는 가로 비율만큼만
문자열 배치
개행문자 기준으로
가장 긴 문자열 찾기
이진 탐색을 통해서
최적의 Font Size 계산
Part 2. Network
UI
Network
Common
BaaS
UI BindingUI Pattern HybridActionbar
(Un)Marshller + Dispatcher(Un)Marshaller SNS
DILogging Lightweight DI
LoggingUser Behavior
Open Source Bas
s
Notification
Standalone
Online
VS
앱으로 돈을 벌기 위해서는...
source : Distimo
네트워크 통신은 필수!!!
일반적인 네트워크 통신
1. 다운로드
1. 네트워크 통신
2. 데이터를 객체로 언마샬링
2. 업로드
1. 객체를 데이터로 마샬링
2. 네트워크 통신
그래서, 코드는?
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet();
get.setURI(new URI("http://www.google.com/"));
HttpResponse resp = client.execute(get);
BufferedReader br = new BufferedReader(new
InputStreamReader(resp.getEntity().getContent()));
String str = null;
StringBuffer sb = new StringBuffer();
while ((str = br.readLine()) != null) {
sb.append(str).append(" ");
}
br.close();
그래서, 코드는?
<categoryList>
<categorys>
<category>
<id>1</id>
<name>AA</name>
<date>2011-11-01</date>
</category>
<category>
<id>2</id>
<name>BB</name>
<date>2011-12-10</date>
</category>
</categorys>
</categoryList>
그래서, 코드는?
while(true) {
int eventType = xpp.nextTag();
if(eventType == XmlPullParser.START_TAG) {
String tag = xpp.getName();
if("id".equals(tag)) {
category.setId(Integer.parseInt(xpp.nextText()));
}else if ("name".equals(tag)) {
category.setName(xpp.nextText());
}else if ("date".equals(tag)) {
category.setDate(xpp.nextText());
}else{
if(XmlPullParser.TEXT == xpp.next())
xpp.nextTag();
네트워크 작업은!
반복적인
네트워크 통신
불편한 데이터
마샬링/언마샬링
5장.
데이터 마샬링/언마샬링
Stub
Proxy
DAOController
REST
GET
DTO
같이 뭉쳐 다니는 파라메터는
ParameterObject로 묶어라!
Simple Framework를
이용하세요.
http://simple.sourceforge.net/
이렇게 됩니다.
<categoryList>
<categorys>
<category>
<id>1</id>
<name>fruit</name>
<date>201110051200</date>
</category>
<category>
<id>2</id>
<name>animal</name>
<date>201110051200</date>
</category>
<category>
<id>3</id>
<name>food</name>
<date>201110051200</date>
</category>
</categorys>
</categoryList>
@Root
public class CategoryList {
@ElementList
private ArrayList<Category> categorys;
public void setCategorys(ArrayList<Category> categorys)
{
this.categorys = categorys;
}
public ArrayList<Category> getCategorys() {
return categorys;
}
}
이렇게 됩니다.
while(true) {
int eventType = xpp.nextTag();
if(eventType == XmlPullParser.START_TAG) {
String tag = xpp.getName();
if("id".equals(tag)) {
category.setId(Integer.parseInt(xpp.nextText()));
}else if ("name".equals(tag)) {
category.setName(xpp.nextText());
}else if ("date".equals(tag)) {
category.setDate(xpp.nextText());
}else{
if(XmlPullParser.TEXT == xpp.next())
xpp.nextTag();
}
}
else
break;
}
Serializer serializer = new Persister();
Reader reader = new StringReader(xmlData);
CategoryList categoryList =
serializer.read(CategoryList.class, reader, false);
Gson를
이용하세요.
http://code.google.com/p/google-
gson/
이렇게 됩니다.
{
"firstName": "John",
"lastName": "Smith",
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": 10021
},
"phoneNumbers": [
"212 732-1234",
"646 123-4567"
]
}
try {
Object obj = JSONValue.parseWithException(s);
JSONArray array = (JSONArray)obj;
JSONObject jobj = null;
for(int i=0;i<array.size();i++) {
jobj = (JSONObject)array.get(i);
System.out.println(i+"번째 : " + jobj.get("hello"));
}
} catch (Exception e) {
e.printStackTrace();
}
Data data = new
Gson().fromJson(json, Data.cl
ass);
Data
UnMarshaling
Marshaling
Layer
Decomposite Message
Dispatching
Network Application Architecture
Component
+sendMsg()
+RecvMsg()
+addDataSet()
DataSetInterface
+size()
+add()
+remove()
Message
+size()
+add()
+remove()
+marshal()
+unmarshal()
DataSet
+size()
*
size()
{ .....
for all DataSets
{ find size and add; }
.....
}
Marshaller / Unmarshaller
6장.
+ Dispatcher
반복적인
네트워크 통신
Spring For Android
과연 좋아졌을까요?
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(new
MediaType("text", "xml"));
HttpEntity<String> requestEntity = new
HttpEntity<String>(requestHeaders);
String url = “http://google.com";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity =
restTemplate.exchange(url,
HttpMethod.GET, requestEntity, String.class);
String result = responseEntity.getBody();
retrofit
https://github.com/square/retrofit
샘플 어플리케이션!
Github user viewer!
Github api 를 사용하여 정보를 출력
- 사용자 검색
- 사용자의 followers
- 사용자의 following
http://developer.github.com/v3/users
사용자 정보 조회 API
https://api.github.com/users/{user_id}
class User {
String id;
String login;
String name;
String blog;
String avatar_url;
}
사용자 클래스
interface GitHub {
@GET("users/{id}")
User getUser(@Named("id")
String id);
}
통신할 인터페이스 정의
RestAdapter restAdapter = new
RestAdapter.Builder()
.setServer(new Server(“https://api.github.com/”))
.setClient(new DefaultHttpClient())
.setConverter(new GsonConverter(new Gson()))
.build();
GitHub github =
restAdapter.create(GitHub.class);
User me =
github.getUser("realbeast");
실제 통신
interface GitHub {
@GET("users/{id}")
User getUser(@Named("id") String id);
@GET("users/{id}/followers")
List<User> getFollowers(@Named("id")
String id);
@GET("users/{id}/following")
List<User> getFollowing(@Named("id")
String id);
}
통신할 인터페이스 추가!!!
RestAdapter restAdapter = new
RestAdapter.Builder()
.setServer(new Server(“https://api.github.com/”))
.setClient(new DefaultHttpClient())
.setConverter(new GsonConverter(new Gson()))
.build();
List<User> followers =
github.getFollowers("realbeast");
for(User user : followers) {
System.out.println(user.login);
}
List<User> following =
github.getFollowing("realbeast");
for(User user : following) {
System.out.println(user.login);
}
추가한 인터페이스 통신
Dispatcher
Dispatcher
handle_events()
register_handler(in handle)
remove_handler(in handle)
Event Handler
handle_event(in type)
get_handle()
Synchronous
Event
Demultiplexer
select()
Concrete
Event Handler
handle_event(in type)
get_handle()
Concrete
Event Handler
handle_event(in type)
get_handle()
Handle
<<uses>>
handle
set
notifies
owns
dispatch
General Collaboration
INITIALIZE
REGISTER HANDLER
EXTRACT HANDLE
RUN EVENT LOOP
WAIT FOR EVENTS
DISPATCH
HANDLER(S)
handle_event(event_type)
get_handle()
register_handler()
Initiation Reactor
select()
Main
program
Concrete
Event_Handler Reactor
handle_events()
EVENTHANDLING
MODE
INITIALIZATION
MODE
Synchronous
Event
Demultiplexer
event
handles
1 … N
Implement
Demultiplexing Table
• This table contains a set of
– <handle, event handler, indication event types>
• Demultiplexing table can be implemented
– Direct indexing, linear search, dynamic hashing
Reactor
handle_events()
register_handler(in handle)
remove_handler(in handle)
Handle
handle
set
Each handle serve as a “key”
Reactor
Handle Table
Concrete
Event Handler
Concrete
Event Handler
10/1/2013 Devpia A&D EVA 114
Dispatcher + Marshaller
Dispatcher
+select()
+handle_events()
+register_handler()
+remove_handler()
Acceptor
+peer_acceptor_
+Acceptor()
+accept()
+handle_event()
Transport
Handle
Connector
+Connector()
+connect()
+complete()
+handle_event()
Service Handler
+peer_stream_
+open()
+handle_event()
+set_handle()
Concrete
Connector
Concrete
AcceptorConcrete
Service
Handler
B
Concrete
Service
Handler
A
Transport
Handle
Transport
Handle
+owns
+owns
+uses
* +uses
*
+uses
*
+uses
owns
notifies
notifies
<<creates>>
<<activate>><<activate>>
7장. SNS Layer
framework
facebook framework Project
세계에서 가장 큰 서비스
854,750,780
(약 8억5천만)
가장 오랜시간 이용하는 서비스
Social Plugin ?
Open Graph ?
Social Channels ?
Authentication ?
Graph API ?
을 개발하려면…
너무 많은 것을 알아야 한다.
framework
facebook framework Project
그래서 우리는..
를 시작했습니다.
Facebook 기본 개념 - 소셜 그래프
120
About Graph API
• Graph API
– 소셜 그래프의 Object(친구, 페이지, 사진 등)를 다루는 API
• Graph API의 구조
– https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE
• ID는 사용자, 페이지, 이벤트, 사진 등의 Object ID
– 약 20개의 Object를 지원
– 모든 Object의 ID는 unique하다
– JSON 형태로 응답을 받는다
121
Graph API Example
• https://graph.facebook.com/100001066448386/
• https://graph.facebook.com/40796308305/
122
신재명 ID
코카콜라 페이지 ID
Graph API - Connection
• Graph API의 구조
– https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE
• Connection이란 ?
– Object의 연관(관계) 개념
• User object의 Connection 종류
– Family, friends, album, likes, posts …
– User object 경우 약 25개의 Connection 을 제공
– https://developers.facebook.com/docs/reference/api/user/ 참고
123
Connection - Example
• Graph API 예시
– https://graph.facebook.com/100001066448386/friends
그럼 보안문제는 ???
124
Access Token
• 페이스북 API를 사용하기 위해 Access Token(인
증)이 필요하다.
• Graph API Explorer를 통하여 쉽게 Access Token
을 받아올 수 있음
125
About Graph API
• Graph API Explorer
– Access Token 받을 수 있다
– 각종 Graph API를 테스트 해볼 수 있다
https://developers.facebook.com/tools/explorer#!/tools/explorer
사용법
127
Step1
Import fHalo.jar
Step2
Get access token
Step3
Create instance
Step4
Using API
Access Token
• 페이스북 API를 사용하기 위해 Access Token(인
증)이 필요하다.
• Graph API Explorer를 통하여 쉽게 Access Token
을 받아올 수 있음
128
친구 리스트 가져오기 (페이스북 API)
친구 리스트 가져오기
– Rest FB
• Connection<User> myFriends =
facebookClient.fetchConnection("me/friends", User.class);
– fHalo
• Connection<Friends> friends = user.friends();
피드 올리기(페이스북 API)
피드 올리기
– Rest FB
• FacebookType publishMessageResponse =
facebookClient.publish("me/feed", FacebookType.class,
Parameter.with("message", "RestFB
test"), Parameter.with(“caption", “caption
test"), Parameter.with(“description", “description test"),);
– fHalo
• Feed feed = new feed();
feed.setMessage("Message Test");
feed.setCaption("Caption Test");
feed.setDescription("Description Test");
user.publishFeed(me, feed);
fHalo Architecture
Volley
Makes networking for android apps easier
Listview + 메타데이터 UI
전형적인 Flow
1. 목록조회 API 호출
2. 결과 데이터 파싱
3. ListView에 display
4. 각 item의 이미지주소로 이미
지 요청
5. 이미지 디코딩 후 ImageView
에 display
감안해야 하는것들
• 쓰레드풀 관리
• 화면 회전시 호출 취소
• Activity의 Null Point 체크
• ImageView의 재활용 & 이미지 캐싱
다양한 버전에서 높은 성능으로 버그없이!
샘플 어플리케이션
일반적인 구현
Adapter loads data from getView()
일반적인 구현 – loadMoreData()
일반적인 구현 – Back in getView()
일반적인 구현 – LoadImage Task
Problems & solutions
일반적인 방법
vs
Volley 사용
Problems
모든 네트워크 요청이 Serial 하게 처리됨
Problems
화면 회전시 데이터 네트워크에서 reload
Problems
View의 재활용을 방해하는 AsyncTask
Problems
Froyo 에서의 호환성 문제
Volley를 이용한 방법
Setup
Volley를 이용한 방법
loadMoreData()
Volley를 이용한 방법
ImageLoader를 통한 이미지로딩
Volley를 이용한 방법
NetworkImageView 사용
Volley 사용하기
1. Clone
2. 코드 import
3. Volley.newRequestQueue(context)
Part 3. Common
UI
Network
Common
BaaS
UI BindingUI Pattern HybridActionbar
(Un)Marshller + Dispatcher(Un)Marshaller SNS
DILogging Sensing
LoggingUser Behavior
Open Source Bas
s
Notification
8장.
Dependency
Injection
1. UI 매핑 (findViewById)
2. 파라미터 처리
(getIntent().getExtras()…)
짜증나는
안드로이드 반복적인 작업
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);
@ViewById
TextView subject;
@ViewById
TextView write;
@ViewById
TextView date
@ViewById
TextView hit;
1. UI 매핑 (findViewById)
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;
2. 파라미터 처리
Reflection
1. (거울 등에 비친) 상
2. (빛・열・소리 등의) 반사, 반향
3. (상태・속성 등의) 반영
클래스 모습을 자신이 볼 수 있고, 수정할 수 도 있는 기술
이클립스 자동완성 (Ctrl+Space)
JDBC Programming…
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
스프링프레임워크
ApplicationContext.xml
<bean id="MessageDao"
class="org.softwaregeeks.nateon.MessageDao"/>
<bean id="NateOn"
class="org.softwaregeeks.nateon.NateOn">
Annotation
1. 주석(을 달기)
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
String value();
}
public class Person {
@Description(value="이름이예요.")
private String name;
@Description(value="나이예요.")
private int age;
Reflection + Annotation
http://code.google.com/p/roboguice/
Google Guice on Android Project!!
class AndroidWay extends Activity {
TextView name;
ImageView thumbnail;
LocationManager loc;
Drawable icon;
String myName;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
name = (TextView) findViewById(R.id.name);
thumbnail = (ImageView) findViewById(R.id.thumbnail);
loc = (LocationManager) getSystemService(Activity.LOCATION
icon = getResources().getDrawable(R.drawable.icon);
class RoboWay extends RoboActivity {
@InjectView(R.id.name) TextView name;
@InjectView(R.id.thumbnail) ImageView thumbnail;
@InjectResource(R.drawable.icon) Drawable icon;
@InjectResource(R.string.app_name) String myName;
@Inject LocationManager loc;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
name.setText( "Hello, " + myName );
}
}
RoboGuice 기능
• 기본 클래스 Inject 가능
RoboGuice 기능
• RoboAsyncTask
기본적인 AsyncTask를 확장하고 onException(),
onFinally() 통해서 에러처리 가능
• Event handlers
OnActivityResultEvent , OnConfigurationChangedEvent, OnCo
ntentChangedEvent, OnContentViewAvailableEvent
OnCreateEvent, OnDestroyEvent 등 많은 이벤트를 받을 수 있도록
어노테이션 지원
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/ProGuard
2. 런타임 리플렉션 사용으로 인한 성능저하
Android
• 배터리문제
• GC(Gabage Collection)
• 느린 Reflection (특히 예전 디바
이스)
• Lifecycle 관리
Reflection vs Code generation
Source
Code
Class file
CompilerAnnotation
Process
Tool
APT(Annotation Process Tool)
JSR 269(JSR 269 Pluggable Annotation Processing API)
Annotation을 사용하여 소스 컴파일 전에
사용자가 원한는 작업을 할 수 있도록 하는 규격
https://github.com/excilys/androidannotations
androidannotations
RoboGuice 와 다르게
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);
}
// DO NOT EDIT THIS FILE, IT HAS BEEN GENERATED USING AndroidAnnotatio
ns.
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));
……
AndroidAnnotations
ClassA.java를 Annotation Process Tool API를 통해
ClassA_.java 파일을 생성하여 처리한다.
1. AndroidManifest.xml 해당 액티비티명 + “_” 추가
2. Intent를 사용시에 작성한 액티비티명 + “_”를 추가하여야
함
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
AndroidAnnoations 기능
• Extras : @Extra
• SystemServices : @SystemService
• Injecting html : @HtmlRes, @FromHtml
• WorkingWithThreads : @Background, @UiThread, @UiThrea
dDelayed
• HandlingEvents : @Click, @LongClick, @Touch, @ItemClick
, @LongItemClick, @ItemSelect
• Handling options menu : @OptionsMenu, @OptionsItem
• REST API(With SpringAndroid) : @Rest, @RestService, @G
et, @Put, @Post, @Delete, @Options, @Head, @ Accept
• Trace Method Execution : @Trace
AndroidAnnoations 기능
• 장점
1. Annotation Process Tool 이용하여 컴파일 시에 모든 코
드가 생성되어 성능상 이점이 있다. (런타임 시 리플렉션
을 사용하지 않음)
2. 다양한 커스텀 어노테이션이 제공됨
• 단점
1. 인텐트를 사용시 “_” 문자열 처리
AndroidAnnoations 장단점
Dagger
https://github.com/square/dagger
DAGger
Directed
Acyclic
Graph
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
...
}
@Module
class DripCoffeeModule {
@Provides
Heater provideHeater() {
return new ElectricHeater();
}
@Provides
Pump providePump(Thermosiphon
pump) {
return pump;
}
}
class CoffeeApp {
public static void main(String[] args) {
ObjectGraph objectGraph
= ObjectGraph.create(new
DripCoffeeModule());
CoffeeMaker coffeeMaker
= objectGraph.get(CoffeeMaker.class);
coffeeMaker.brew();
}
}
final class CoffeeMaker$InjectAdapter extends Binding<CoffeeMaker> {
private Binding<Heater> f0;
private Binding<Pump> f1;
public CoffeeMaker$InjectAdapter() {
super("coffee.CoffeeMaker", ...);
}
public void attach(Linker linker) {
f0 = linker.requestBinding("coffee.Heater", coffee.CoffeeMaker.class);
f1 = linker.requestBinding("coffee.Pump", coffee.CoffeeMaker.class);
}
public CoffeeMaker get() {
coffee.CoffeeMaker result = new coffee.CoffeeMaker();
injectMembers(result);
return result;
}
public void injectMembers(CoffeeMaker object) {
object.heater = f0.get();
object.pump = f1.get();
}
Startup time for Square Wallet
on one device improved from
~5 seconds to ~2 seconds
AndroidAnnotations
+
Dagger
https://github.com/pyricau/androidann
otations-dagger-example
Funf
About
• 안드로이드폰의 각종 센서를 쉽게 사용할
수 있는 오픈소스 프레임워크
Who is Funf for?
• Self – Tracking
– Funf Journal 이라는 앱을 통해 원하는 센서 값만 받아
볼 수 있다. 개인적으로 자신의 데이터를 분석하는데
사용
• Study Managers/Researchers
– 센서를 통해얻는 여러 정보들을 모아서 분석하고 연구
• API-Level Developers
– Funf의 내부단을 사용하지 않고 3rd-party 개발자 API만
사용하여 개발 할 수 있도록 해준다
• Core-Level Developers
– Funf에 없는 새로운 센서를 추가하거나 기존에 있는 센
서 측정의 performance를 높인다
Funf probe List
• Physical sensor(Hardware), Logical sensor(Software)
 Probe
Funf journal(Self-Tracker)
• Funf framework를 이용해 만든 Application
• 간단하게 원하는 센서들의 데이터 수집 가능
• 수집주기, 데이터 전송 위치 설정 가능
Funf journal
• 수집된 데이터는 *.db 파일이며, 암호화 되어있다
– 디코딩 프로그램제공(http://funf.media.mit.edu/downloads/funf_analyze_win.zip)
– JSON 형태의 결과 데이터
Funf in a box
• Researcher 용으로 여러 테스터들에게서 원하는 센서데
이터들을 수집하는데 사용
• 간단하게 데이터 수집용 앱을생성
• APP 이름, 데이터를 받을 e-mail,
수집할 센서정보를 세팅 한 후
생성하면 .apk 파일을 얻을 수 있다.
Funf in a box
• .apk 파일은 Dropbox를 통해서 받을 수 있다
– https://www.dropbox.com/
Key feature
• 수집된 데이터는 JSON 형태
• 수집데이터를 원격지에 주기적으로 보낼 수 있다
• 약 30여개의 probe 제공
• 암호화를 통해 민감한 정보를 숨김(폰번호, 이름 등)
• 로컬 저장하는 DB 파일은 암호화되어 저장됨
• 15개월의 테스트를 통해 프레임웍을 검증
• 배터리 소모량 최적화
Tutorial
• Google code에 source 및 각종설명
– http://code.google.com/p/funf-open-sensing-framework/wiki/GettingStarted?tm=6(wiki)
• Git 을 통해 소스 배포
– https://code.google.com/p/funf-open-sensing-framework.samples(샘플)
– https://code.google.com/p/funf-open-sensing-framework (funf framework)
• Jar file로도 제공
– http://code.google.com/p/funf-open-sensing-framework/downloads/list
Tutorial
• Probe 정보
– http://code.google.com/p/funf-open-sensing-framework/wiki/BuiltinProbes
• Probe parameter
– Period
– Duration
– Start
– End
Tutorial
• Probe 사용법
– Asset/default_config.json 에 설정하기
Tutorial(Example)
• Asset/default_config.json 에 설정 후
• 사용할 서비스와 퍼미션 등록
Tutorial(Example)
• 서비스 실행
– MainPipeLine.class 에서 config 정보 읽어서 세팅함
– MainPipeLine 코드 중 getMainConfig()
• onHandleIntent()에서 getMainConfig() 실행
Tutorial(Example)
• Sdcard/edu.mit.media.funf.wifiscanner 에 저장됨
• Funf_analyze 프로그램을 같은 폴더에 넣고 실행
– Default 비밀번호 : changeme
Tutorial(Example)
• Merged_data.db 생성됨
– Id : unique id for the data entry
– Device : UUID for the device
– Timestamp : long, UTC in seconds since epoch
– Value : result data in json format
Part 4. BaaS
Backend As A Service
Android Application Block
UI
Network
Common
BaaS
UI BindingUI Pattern HybridActionbar
(Un)Marshller + Dispatcher(Un)Marshaller SNS
DILogging Lightweight DI
User Log +
Crash Log
User Behavior Open Source BaaSNotification
Backend
(as a Service)
BaaS(Backend As A Service)
서버 개발을 모르는 클라이언트 개발자
도
쉽게 서버가 필요한 앱을 만들 수 있게
도와주는 서비스
https://www.parse.com/
9장. Parse
월 100만건 호출까지는 무료...
ParseObject gameScore = new
ParseObject("GameScore");
gameScore.put("score", 1337);
gameScore.put("playerName", "Sean Plott");
gameScore.put("cheatMode", false);
gameScore.saveInBackground();
데이터 저장하기
Key-value 된 값을 저장
데이터 저장하기
Data Browser 통해서 확인가능
<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParseBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
PushService.subscribe(this, "", YourActivity.class);
푸시설정
푸시보내기
10장.
사용자 행동 분석
Sleep If you can.
Issue..
월드 와이드 앱
모바일 어플리케이션
분석 플랫폼
메인 DASHBOARD
Daypart
Device (국내는…)
Device (월드 와이드 앱은..)
App Version
TagEvent (사용자가 많이쓰는 기능)
사용자가 어떤 화면을 많이 사용하는지
(유료기능)
이외에도..
• New vs Returning
• Carrier
• Country
• OS Version
적용방법
• http://www.localytics.com/에서
• 탭 에서 어플리케이션 등록
• http://bit.ly/KnZzpx 에서 소스코드 다운
• Android 프로젝트
src/폴더에 소스코드 추가
• AndroidManifest.xml에 퍼미션 추가
<uses-permission
android:name="android.permission.INTERNET“>
• 클래스 내부에 session object 추가
• Main Activity에 Import
• OnCreate 함수에 아래 소스 추가
import com.localytics.android.*;
private LocalyticsSession localyticsSession;
public void onCreate(Bundle savedInstanceState)
{ .
.
.
this.localyticsSession = new LocalyticsSession(this.getApplicationContext(),
"APP KEY FROM STEP 2");
this.localyticsSession.open(); // open the session
this.localyticsSession.upload(); // upload any data
.
.
.
}
• onResume 메소드 Override
• onPause 메소드 Override
public void onPause()
{
this.localyticsSession.close();
this.localyticsSession.upload();
super.onPause();
}
public void onResume()
{
super.onResume();
this.localyticsSession.open();
}
• TagEvent남기기
localyticsSession.tagEvent(“TagEvent남김
");
11장. LogDog
http://openlogdog.appspot.com/index.html
구글의 폐쇄성으로 안드로이드에 반영되지 못한
외부 로그 오픈소스와 서비스들은?
MicroLog4Andorid
LogCat의 단점을 보완한 안드로이드용
로그 오픈소스 라이브러리
LogCat과 동시에 파일로도 저장 가능
그러나…
MicroLog4Andorid
public class LogtestActivity extends Activity {
static public Logger logger = LoggerFactory.getLogger();
@Override
public void onCreate(Bundle savedInstanceState) {
PatternFormatter formatter = new PatternFormatter();
formatter.setPattern( " %d{ISO8601} [%P] %m %T " );
logger.setLevel(Level.INFO);
// write to LogCat
LogCatAppender logCatAppender = new LogCatAppender();
logCatAppender.setFormatter(formatter);
logger.addAppender(logCatAppender);
// write to text file of SD-card.
FileAppender fileAppender = new FileAppender();
fileAppender.setAppend( true );
fileAppender.setFileName( "microlog4android.log" );
fileAppender.setFormatter(formatter);
logger.addAppender(fileAppender);
소스 내부에서
설정
로그를 보내는
기능이 없다
MicroLog4Andorid
그래서! 직접 만듦 ㅠㅠ
ACRA - Application Crash Report for Android
에러리포트를 Google Docs나 Email로 전송하는 오픈소스
하지만
?
BugSense
ACRA보다 나은 정보제공
웹 UI 제공
하지만??
BugSense
Open
Source
편리한
UI
충분한
정보
LogDog 클라이언트
로깅 방법
public class LogtestActivity extends Activity {
static public Logger logger = LoggerFactory.getLogger();
@Override
public void onCreate(Bundle savedInstanceState) {
PatternFormatter formatter = new PatternFormatter();
formatter.setPattern( " %d{ISO8601} [%P] %m %T " );
logger.setLevel(Level.INFO);
// write to LogCat
LogCatAppender logCatAppender = new LogCatAppender();
logCatAppender.setFormatter(formatter);
logger.addAppender(logCatAppender);
// write to text file of SD-card.
FileAppender fileAppender = new FileAppender();
fileAppender.setAppend( true );
fileAppender.setFileName( "microlog4android.log" );
fileAppender.setFormatter(formatter);
logger.addAppender(fileAppender);
로깅 방법
public class LogDogClient extends Application {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
LogDog.LogDoginitialize(this,"설정.xml");
}
}
<Log>
<Level>debug</Level>
</Log>
<Appenders>
<AppenderList class="java.util.ArrayList">
<Appender AppenderName="LogCat">
<Formatter class="com.logdog.Formatter.PatternFormatter">
<PatternString> %d{ISO8601} [%P] %m %T </PatternString>
</Formatter>
</Appender>
</AppenderList>
</Appenders>
<Appender AppenderName="AppEngine">
<Formatter class="com.logdog.Formatter.PatternFormatter">
<PatternString> %d{ISO8601} [%P] %m %T </PatternString>
</Formatter>
<LogFileName>log.txt</LogFileName>
<SaveDirName>LogDog1</SaveDirName>
<AppComunicator CommunicatorName="AppEngineComm">
<URL>http://swlogdog7.appspot.com/logdog/Report/</URL>
</AppComunicator>
</Appender>
</AppenderList>
</Appenders>
클라이언트 작동 방식
설정파일
Factory
Error
Report
Log
File AppEngineLogCat
AppenderList
클라이언트 작동 방식 - 예
Error
Report
Log
File LogCat
AppenderList
설정파일
AppEngine
Jso
n
버그 리포팅 기능 제공
Exception,
불가피한 종료
버그 리포팅
ReportTime 에러 발생 시간
Model 스마트폰 모델명
National 발생 국가
ErrorName 에러 이름
ErrorClassName 에러 클래스 이름
Line 에러 라인
AppVersion 앱버전
OSVersion OS버전
GPS GPS상태
WiFi WiFi 상태
MobileNetwork 3G상태
ScreenWidth 스크린 크기
ScreenHeight 스크린 크기
CallStack 콜스택 정보
Log 로그 정보
클라이언트 아키텍처
LogDog ACRA
Pollution : 0.67
Pollution : 3.70
LogDog
ACRA
클라이언트 오염도
Polution : 0.67 Polution : 3.70
LogDog ACRA
LogDog Web
263
BugSense - 시각화 문제점
BugSense - 일별 보기만 제
공
일별 보기
- 7일 구간 -
일별 보기
- 30일 구간 -
부족한 날짜 별 에러 그래프
일별 보기
- 30일 구간 -
시간에 따른
오류의 변화를 관측하기는
너무 부족한 정보!!
주간
에러 변화는?
월간
에러 변화는?
LogDog - 개선된 Date 그래프
보다 다양한 형태로
분석 가능한 Date 그래프
일별
주별 월별
BugSense - 관계없는 버전 정보
App 버전 그래프 OS 버전 그래프
부족한 에러 그래프
App 버전 그래프 OS 버전 그래프
App 버전과 OS 버전
둘의 관계성을 파악이
불가능한 구조!!
이 App 버전에서는
어떤 OS 버전이 문제인가?
App 업데이트가 문제인가?
OS 버전만의 문제인가?
LogDog - Version 그래프
1.4 1.5 1.1 1.55
BugSense - 유일한 상호작용
드래그
하면…
확대…?
LogDog - 의미있는 상호작용
LogDog - 에러 분포 리포트 제공
에러가 발생하는
클래스의 분포도를 한눈에 파악할 수 있는 리포트
LogDog web의 초기 구조
Error
Google App
Engine
Data
Store(HighChart, jqGrid,
Bootstrap)
Web
JDO
JDO
에러
Java- servlet
Servlet만을 이용한 개발
1. 개발하기가 다른 것에 비해 힘들다.
2. 유지보수가 힘들다.
3. 특히 다른 개발자가 구조를 파악하기 힘들다.
이게 도대체
무슨 구조야?
Jersey 1.15
http 메소드:
get, post, put ,delete
REST 기반 서버 구성
REST: ROA(Resource Oriented Architecture)를
따르는 웹 서비스 디자인 표준
REST 서버 구축을
도와주는 오픈소스
URL
GAE – frontend
GAE Frontend의 한계
작업 요청
30초 내에 응답
(못하면 자동 취소)
Data Store의 정보를 Select 하는 경우는 빠르지만,
Insert, Update는 오랜 시간이 걸려 문제 발생!!
GAE – Backend
GAE Backend
작업 요청
Task queue
작업 등록
Backend는 30초의 시간 제한이 존재하지 않는다.
Task Queue
작업이 승인됨을 알림
Data
Store
GAE
Backend
Queue에 등록된
작업을 가져옴 작업 등록
Logdog web의 작동 구조
Error
GAE
Backend
Google App Engine
Jersey
1.15
Data
Store
Task Queue
(HighChart, jqGrid,
Bootstrap)
Web
JDO
JDO
에러
Frontend
Communicator
Framework
Logdog Web Architecture
http://apigee.com
12장. Apigee
BaaS를 구축하기 위한 opensouce stack
https://github.com/apigee/usergrid-stack
https://baas.io
다양한 BaaS 제공되고 있기 때문에
모바일 개발자 입장에서 서비스를 택해
서
개발을 쉽게 할 수 있음
Q&A

Weitere ähnliche Inhalte

Andere mochten auch

(주)비에네스소프트 회사소개서 2013년9월
(주)비에네스소프트 회사소개서 2013년9월(주)비에네스소프트 회사소개서 2013년9월
(주)비에네스소프트 회사소개서 2013년9월Seongju Jeon
 
Orculus Rift 오큘러스 리프트
Orculus Rift 오큘러스 리프트Orculus Rift 오큘러스 리프트
Orculus Rift 오큘러스 리프트Hyesung Cho
 
당신에게 통일은 여전히 소원인가요? | 이현서 북한인권운동가
당신에게 통일은 여전히 소원인가요? | 이현서 북한인권운동가 당신에게 통일은 여전히 소원인가요? | 이현서 북한인권운동가
당신에게 통일은 여전히 소원인가요? | 이현서 북한인권운동가 cbs15min
 
안드로이드 어플 개발 전략 10가지 2부
안드로이드 어플 개발 전략 10가지 2부안드로이드 어플 개발 전략 10가지 2부
안드로이드 어플 개발 전략 10가지 2부mosaicnet
 
디지털(1)
디지털(1)디지털(1)
디지털(1)ljy6593
 
[Hmd의 정체]
[Hmd의 정체][Hmd의 정체]
[Hmd의 정체]Ma Ae-rin
 
Hmd(head mounted display) 의 ‘이모저모’
Hmd(head mounted display) 의 ‘이모저모’Hmd(head mounted display) 의 ‘이모저모’
Hmd(head mounted display) 의 ‘이모저모’고주라
 
Hmd에 대해서
Hmd에 대해서Hmd에 대해서
Hmd에 대해서Yowon Kang
 
세바시15분 상상이 현실화가 되는 세계, 그...@서동일 오큘러스VR코리아 지사장
세바시15분 상상이 현실화가 되는 세계, 그...@서동일 오큘러스VR코리아 지사장세바시15분 상상이 현실화가 되는 세계, 그...@서동일 오큘러스VR코리아 지사장
세바시15분 상상이 현실화가 되는 세계, 그...@서동일 오큘러스VR코리아 지사장cbs15min
 
S블로거가 본 스마트tv
S블로거가 본 스마트tvS블로거가 본 스마트tv
S블로거가 본 스마트tvTaehyun Brad Kim
 
[한국의SNS 컨퍼런스]N스크린 기반 스마트UX
[한국의SNS 컨퍼런스]N스크린 기반 스마트UX[한국의SNS 컨퍼런스]N스크린 기반 스마트UX
[한국의SNS 컨퍼런스]N스크린 기반 스마트UXBosnag-Kim
 
제안서N School(영상교육영상회의)[1]
제안서N School(영상교육영상회의)[1]제안서N School(영상교육영상회의)[1]
제안서N School(영상교육영상회의)[1]kisu kim
 
가상현실 & 증강현실
가상현실 & 증강현실가상현실 & 증강현실
가상현실 & 증강현실범진 박
 
RAD Studio XE8을 소개합니다.
RAD Studio XE8을 소개합니다.RAD Studio XE8을 소개합니다.
RAD Studio XE8을 소개합니다.Devgear
 
비즈니스 Application 솔루션 구조 기술 진화 모델 ②
비즈니스 Application 솔루션 구조 기술 진화 모델 ②비즈니스 Application 솔루션 구조 기술 진화 모델 ②
비즈니스 Application 솔루션 구조 기술 진화 모델 ②Yongkyoo Park
 

Andere mochten auch (16)

(주)비에네스소프트 회사소개서 2013년9월
(주)비에네스소프트 회사소개서 2013년9월(주)비에네스소프트 회사소개서 2013년9월
(주)비에네스소프트 회사소개서 2013년9월
 
Orculus Rift 오큘러스 리프트
Orculus Rift 오큘러스 리프트Orculus Rift 오큘러스 리프트
Orculus Rift 오큘러스 리프트
 
당신에게 통일은 여전히 소원인가요? | 이현서 북한인권운동가
당신에게 통일은 여전히 소원인가요? | 이현서 북한인권운동가 당신에게 통일은 여전히 소원인가요? | 이현서 북한인권운동가
당신에게 통일은 여전히 소원인가요? | 이현서 북한인권운동가
 
안드로이드 어플 개발 전략 10가지 2부
안드로이드 어플 개발 전략 10가지 2부안드로이드 어플 개발 전략 10가지 2부
안드로이드 어플 개발 전략 10가지 2부
 
디지털(1)
디지털(1)디지털(1)
디지털(1)
 
[Hmd의 정체]
[Hmd의 정체][Hmd의 정체]
[Hmd의 정체]
 
Hmd(head mounted display) 의 ‘이모저모’
Hmd(head mounted display) 의 ‘이모저모’Hmd(head mounted display) 의 ‘이모저모’
Hmd(head mounted display) 의 ‘이모저모’
 
Hmd에 대해서
Hmd에 대해서Hmd에 대해서
Hmd에 대해서
 
세바시15분 상상이 현실화가 되는 세계, 그...@서동일 오큘러스VR코리아 지사장
세바시15분 상상이 현실화가 되는 세계, 그...@서동일 오큘러스VR코리아 지사장세바시15분 상상이 현실화가 되는 세계, 그...@서동일 오큘러스VR코리아 지사장
세바시15분 상상이 현실화가 되는 세계, 그...@서동일 오큘러스VR코리아 지사장
 
S블로거가 본 스마트tv
S블로거가 본 스마트tvS블로거가 본 스마트tv
S블로거가 본 스마트tv
 
[한국의SNS 컨퍼런스]N스크린 기반 스마트UX
[한국의SNS 컨퍼런스]N스크린 기반 스마트UX[한국의SNS 컨퍼런스]N스크린 기반 스마트UX
[한국의SNS 컨퍼런스]N스크린 기반 스마트UX
 
영화정보기술
영화정보기술영화정보기술
영화정보기술
 
제안서N School(영상교육영상회의)[1]
제안서N School(영상교육영상회의)[1]제안서N School(영상교육영상회의)[1]
제안서N School(영상교육영상회의)[1]
 
가상현실 & 증강현실
가상현실 & 증강현실가상현실 & 증강현실
가상현실 & 증강현실
 
RAD Studio XE8을 소개합니다.
RAD Studio XE8을 소개합니다.RAD Studio XE8을 소개합니다.
RAD Studio XE8을 소개합니다.
 
비즈니스 Application 솔루션 구조 기술 진화 모델 ②
비즈니스 Application 솔루션 구조 기술 진화 모델 ②비즈니스 Application 솔루션 구조 기술 진화 모델 ②
비즈니스 Application 솔루션 구조 기술 진화 모델 ②
 

Ähnlich wie 안드로이드 오픈소스 어플리케이션 블록

[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
 
Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Bansook Nam
 
[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성NAVER D2
 
[1B6]Realm a database for android & ios
[1B6]Realm a database for android & ios[1B6]Realm a database for android & ios
[1B6]Realm a database for android & iosNAVER D2
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
Open Source Engineering V2
Open Source Engineering V2Open Source Engineering V2
Open Source Engineering V2YoungSu Son
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 APINAVER Engineering
 
Social game and windows azure platform (final)
Social game and windows azure platform (final)Social game and windows azure platform (final)
Social game and windows azure platform (final)정현 남
 
웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)JoonHee Lee
 
생체 광학 데이터 분석 AI 경진대회 3위 수상작
생체 광학 데이터 분석 AI 경진대회 3위 수상작생체 광학 데이터 분석 AI 경진대회 3위 수상작
생체 광학 데이터 분석 AI 경진대회 3위 수상작DACON AI 데이콘
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기John Kim
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트병한 유
 
20131217 html5
20131217 html520131217 html5
20131217 html5DK Lee
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱NAVER D2
 
[AI & DevOps] BigData Scale Production AI 서비스를 위한 최상의 플랫폼 아키텍처
[AI & DevOps] BigData Scale Production AI 서비스를 위한 최상의 플랫폼 아키텍처[AI & DevOps] BigData Scale Production AI 서비스를 위한 최상의 플랫폼 아키텍처
[AI & DevOps] BigData Scale Production AI 서비스를 위한 최상의 플랫폼 아키텍처hoondong kim
 

Ähnlich wie 안드로이드 오픈소스 어플리케이션 블록 (20)

[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지
 
[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성
 
[1B6]Realm a database for android & ios
[1B6]Realm a database for android & ios[1B6]Realm a database for android & ios
[1B6]Realm a database for android & ios
 
Modern android
Modern androidModern android
Modern android
 
Kinect sdk사용하기
Kinect sdk사용하기Kinect sdk사용하기
Kinect sdk사용하기
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
Open Source Engineering V2
Open Source Engineering V2Open Source Engineering V2
Open Source Engineering V2
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
Social game and windows azure platform (final)
Social game and windows azure platform (final)Social game and windows azure platform (final)
Social game and windows azure platform (final)
 
웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)
 
Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
 
생체 광학 데이터 분석 AI 경진대회 3위 수상작
생체 광학 데이터 분석 AI 경진대회 3위 수상작생체 광학 데이터 분석 AI 경진대회 3위 수상작
생체 광학 데이터 분석 AI 경진대회 3위 수상작
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트
 
20131217 html5
20131217 html520131217 html5
20131217 html5
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱
 
[AI & DevOps] BigData Scale Production AI 서비스를 위한 최상의 플랫폼 아키텍처
[AI & DevOps] BigData Scale Production AI 서비스를 위한 최상의 플랫폼 아키텍처[AI & DevOps] BigData Scale Production AI 서비스를 위한 최상의 플랫폼 아키텍처
[AI & DevOps] BigData Scale Production AI 서비스를 위한 최상의 플랫폼 아키텍처
 

Mehr von YoungSu Son

Fault Tolerance 패턴
Fault Tolerance 패턴 Fault Tolerance 패턴
Fault Tolerance 패턴 YoungSu Son
 
Clean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningClean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningYoungSu Son
 
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화YoungSu Son
 
Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) YoungSu Son
 
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)YoungSu Son
 
Singleton 패턴 (김진영 - EVA, 소마에 10기)
Singleton 패턴 (김진영 -  EVA, 소마에 10기) Singleton 패턴 (김진영 -  EVA, 소마에 10기)
Singleton 패턴 (김진영 - EVA, 소마에 10기) YoungSu Son
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 YoungSu Son
 
생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) 생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) YoungSu Son
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) YoungSu Son
 
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) 모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) YoungSu Son
 
DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 YoungSu Son
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기YoungSu Son
 
Android 성능 지표와 Oreo 의 개선사항
Android 성능 지표와  Oreo 의 개선사항 Android 성능 지표와  Oreo 의 개선사항
Android 성능 지표와 Oreo 의 개선사항 YoungSu Son
 
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법YoungSu Son
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기YoungSu Son
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법 YoungSu Son
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 YoungSu Son
 
Android Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionAndroid Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionYoungSu Son
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기) YoungSu Son
 

Mehr von YoungSu Son (20)

Fault Tolerance 패턴
Fault Tolerance 패턴 Fault Tolerance 패턴
Fault Tolerance 패턴
 
Clean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningClean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance Tuning
 
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
 
Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭)
 
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
 
Singleton 패턴 (김진영 - EVA, 소마에 10기)
Singleton 패턴 (김진영 -  EVA, 소마에 10기) Singleton 패턴 (김진영 -  EVA, 소마에 10기)
Singleton 패턴 (김진영 - EVA, 소마에 10기)
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우
 
생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) 생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기)
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
 
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) 모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
 
DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기
 
Android 성능 지표와 Oreo 의 개선사항
Android 성능 지표와  Oreo 의 개선사항 Android 성능 지표와  Oreo 의 개선사항
Android 성능 지표와 Oreo 의 개선사항
 
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법
 
Android Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionAndroid Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + Genymotion
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 

안드로이드 오픈소스 어플리케이션 블록

Hinweis der Redaktion

  1. 앞에 일반적인 방법에는 그대로 출시하기엔 비효율적인 요소부터 많은 문제점들이 있습니다.어떤 문제점이 있는지 살펴보도록 하겠습니다.
  2. 앞의 예제에서는 모든 네트워크 요청이 순차적으로 일어납니다.따라서 스크롤을 내려서 다음페이지를 읽어려고 해도 전 페이지의 로딩이 끝나야지만 넘어 갈 수 있습니다.Volley 에서는 쓰레드풀 관리를 통해 네트워크 요청을 자동으로 스케쥴링 하고 있습니다.Playstore에 적용하여 테스트한 결과 4개의 쓰레드일때가 가장 퍼포먼스가 좋아서 디폴트는 4개이나 사용자가 임의로 수정도 가능합니다.또한 volley에서는 요청 우선순위도 설정할 수 있기 때문에 이미지로딩에 낮은 우선순위를 주어서 제목이나 내용 부터 로딩하는 등의 방법이 가능합니다.
  3. 화면 회전시 Activity가 재 생성되고 처음부터 모든 네트워크 작업이 다시 일어납니다. 이를 해결하기 위해 많은 분들이 cache를 이용해 저장하고 다시 불러오는 작업들을 하고 계시는데Volley를 이용하면 이런 불편한 작업들을 해결할 수 있습니다.Volley에서는 사용자가 캐쉬를 신경쓰지 않더라도 자동으로 캐쉬되어 네트워크에서 reload 하지않고 불러옵니다.
  4. 이미지요청을날리고 그 사이에 사용자가 스크롤을 내렸다면 view를 재활용할 수가 없습니다.이런 불편함을 해소하기 위해 Volley는 요청 취소 기능을 제공하기 때문에 원하는 요청을 취소 할 수 있습니다.
  5. 진저브레드 이전까지의 HttpURLConnection은 문제가 많았었는데,volley를 이용하면 쉽게 네트워크 레이어를 변경함으로써 자신의 버전에 맞는 네트워크 레이어를 사용할 수 있습니다.
  6. JsonObjectRequest를 이용하여 데이터를 받아와서 파싱 후 display하는것까지 boilerplate 코드 없이 잘 이루어져 있습니다