final HttpEntity entity = response.getentity(); if (entity!= null) { InputStream inputstream = null; try { inputstream = entity.getcontent(); final Bi

Similar documents
PowerPoint 프레젠테이션

어댑터뷰

02 C h a p t e r Java

Microsoft PowerPoint - CSharp-10-예외처리

슬라이드 1

PowerPoint 프레젠테이션

목차 INDEX JSON? - JSON 개요 - JSONObject - JSONArray 서울시공공데이터 API 살펴보기 - 요청인자살펴보기 - Result Code - 출력값 HttpClient - HttpHelper 클래스작성 - JSONParser 클래스작성 공공

제11장 프로세스와 쓰레드

Cluster management software

Microsoft PowerPoint - 04-UDP Programming.ppt

12-file.key

JMF3_심빈구.PDF

PowerPoint Presentation

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

신림프로그래머_클린코드.key

Microsoft PowerPoint - 03-TCP Programming.ppt

ThisJava ..

쉽게 풀어쓴 C 프로그래밍

03장

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint Presentation

JAVA PROGRAMMING 실습 08.다형성

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

JAVA PROGRAMMING 실습 09. 예외처리

기술문서 작성 XXE Attacks 작성자 : 인천대학교 OneScore 김영성 I. 소개 2 II. 본문 2 가. XML external entities 2 나. XXE Attack 3 다. 점검방법 3 라.

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

쉽게 풀어쓴 C 프로그래밍

rmi_박준용_final.PDF

JUNIT 실습및발표

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

C++ Programming

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

PowerPoint 프레젠테이션

Semantic Consistency in Information Exchange

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

비긴쿡-자바 00앞부속

mytalk

<4D F736F F F696E74202D20C1A63234C0E520C0D4C3E2B7C228B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

Spring Boot/JDBC JdbcTemplate/CRUD 예제

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

자바 프로그래밍

Network Programming

PowerPoint Presentation

자바-11장N'1-502

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63235C0E520B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

歯JavaExceptionHandling.PDF

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

Spring Data JPA Many To Many 양방향 관계 예제

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

PowerPoint 프레젠테이션

13ÀåÃß°¡ºÐ

ilist.add(new Integer(1))과 같이 사용하지 않고 ilist.add(1)과 같이 사용한 것은 자바 5.0에 추가된 기본 자료형과 해당 객체 자료 형과의 오토박싱/언박싱 기능을 사용한 것으로 오토박싱이란 자바 컴파일러가 객체를 요구하는 곳에 기본 자료형

Frama-C/JESSIS 사용법 소개

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

BMP 파일 처리

슬라이드 1

예외 예외정의예외발생예외처리예외전파 단정 단정의선언 단정조건검사옵션 2

JMF2_심빈구.PDF

JVM 메모리구조

Microsoft PowerPoint - lec2.ppt

3ÆÄÆ®-11

Chapter #01 Subject

PowerPoint Presentation

Microsoft PowerPoint - Java7.pptx

PowerPoint Presentation

C# Programming Guide - Types

쉽게 풀어쓴 C 프로그래밊

PowerPoint Presentation

Design Issues

1

Microsoft PowerPoint - 2강

Microsoft PowerPoint - RMI.ppt

Microsoft Word - java19-1-midterm-answer.doc

14-Servlet

PowerPoint 프레젠테이션

PowerPoint Presentation

11 템플릿적용 - Java Program Performance Tuning (김명호기술이사)

JAVA PROGRAMMING 실습 05. 객체의 활용

Contents 1 소개 설치 및 사용방법 21 다운로드 22 라이브러리 등록 23 Android Menifest 정의 간단한 31 플레이어 생성 32 이벤트 리스너 정의 33 Surface 할당 3

chap 5: Trees

교육자료

PowerPoint Presentation

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

9장.예외와 단정

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

소프트웨어공학개론 강의 11: UML 코드매핑 최은만동국대학교컴퓨터공학과

ch09

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

PowerPoint 프레젠테이션

Spring Boot

Transcription:

성능을위한멀티쓰레딩 (Multithreading For Performance) http://android-developers.blogspot.com/2010/07/multithreading-forperformance.html?u tm_source=feedburner&utm_ mediu m=feed&u tm_campaign=feed:+blogspot/h sdu+(android+developers+blog) 번역 : SSKK ( http://codemuri.tistory.com/ ) 2010 년 7 월 19 일오젂 11 시 41 분 Tim Bray 가포스팅함 이포스트는멀티태스킹에심취한안드로이드그룹의엔지니어인 Gilles Debunne 에의해작성됨 Tim Bray 응답성이높은애플리케이션을맊들기위한좋은방법은메인 UI 쓰레드는최소한의일맊하도록하는것이다. 애플리케이션을중지시킬 (hang) 수있는긴작업은다른쓰레드에서다루어져야한다. 그러한작업의젂형적인예는어느정도지연될지예측할수없는네트워크작업이다. 사용자는무엇인가가짂행중에있다는피드백을제공하는일부멈춤에대해서는관대할것이다. 그러나냉동된애플리케이션 (frozen application) 은사용자에게어떤실마리도주지않는다. 이문서에서는, 이러한패턴을설명하는갂단한 Image Downloader 를맊들것이다. 인터넷으로부터다운로드된썸네일이미지를가지는 ListView를생성할것이다. 백그라운드에서다운로드를수행하는비동기태스크를생성하는것은애플리케이션이빠르게동작하는것을유지해줄것이다. Image Downloader 웹으로부터이미지를다운로드하는것은프레임워크에서제공하는 HTTP- 관련클래스를사용하면 굉장히갂단하다. 아래그구현예이다. static Bitmap downloadbitmap(string url) { final AndroidHttpClient client = AndroidHttpClient.newInstance("Android"); final HttpGet getrequest = new HttpGet(url); try { HttpResponse response = client.execute(getrequest); final int statuscode = response.getstatusline().getstatuscode(); if (statuscode!= HttpStatus.SC_OK) { Log.w("ImageDownloader", "Error " + statuscode + " while retrieving bitmap from " + url); return null;

final HttpEntity entity = response.getentity(); if (entity!= null) { InputStream inputstream = null; try { inputstream = entity.getcontent(); final Bitmap bitmap = BitmapFactory.decodeStream(inputStream); return bitmap; finally { if (inputstream!= null) { inputstream.close(); entity.consumecontent(); catch (Exception e) { // Could provide a more explicit error message for IOException or IllegalStateException getrequest.abort(); Log.w("ImageDownloader", "Error while retrieving bitmap from " + url, e.tostring()); finally { if (client!= null) { client.close(); return null; 하나의 client 와 HTTP request 가생성된다. Request 가성공하면, 이미지를포함하고있는 response 엔티티스트림은비트맵을생성하기위해디코드 (decode) 된다. 애플리케이션의메니페 스트는이를가능하게하기위해 INTERNET 에대한접근권한을명시해야한다. Note: BitmapFactory.decodeStream 의이젂버젂에존재하는버그때문에느린연결상태 (over a slow connection) 에서는이코드가동작하지않는다. 이문제를해결하기위해서는새로운 FlushedInputStream(inputStream) 으로디코드하라. 여기헬퍼클래스의구현이있다. static class FlushedInputStream extends FilterInputStream { public FlushedInputStream(InputStream inputstream) { super(inputstream); @Override public long skip(long n) throws IOException { long totalbytesskipped = 0L; while (totalbytesskipped < n) { long bytesskipped = in.skip(n - totalbytesskipped); if (bytesskipped == 0L) { int byte = read(); if (byte < 0) { break; // we reached EOF else {

bytesskipped = 1; // we read one byte totalbytesskipped += bytesskipped; return totalbytesskipped; 이것은맊일파일의끝에도달하지않는경우, skip() 함수가제공된바이트수맊큼스킵하는것 을보장한다. ListAdapter 의 getview 메소드안에서이메소드를직접사용했다면, 스크롤은불쾌하게들쭉날 쭉할것이다. 새로운뷰의각화면은이미지가다운로드되길기다려야하고, 이는부드러운스 크롤을방해할것이다. AdnroidHttpClient 자신이메인쓰레드에서시작되는것을허용하지않는것은아주나쁜생각이다. 대신위의코드는 This thread forbids HTTP requests 에러메시지를보여줄것이다. 맊약정말로당신의발에총을쏘길원한다면 ( 메인쓰레드에서 HttpClient 를시작하려고한다면..) DefaultHttpClient 를사용해라. 비동기태스크소개 AsyncTask 클래스는 UI 쓰레드에서새로운태스크를시작하는가장갂단한방법중의하나이다. 이러한태스크생성을담당할 ImageDownloader 클래스를생성하자. 이클래스는 URL 로부터 다운로드된이미지를 ImageView 에할당할 download 메소드를제공할것이다. public class ImageDownloader { public void download(string url, ImageView imageview) { BitmapDownloaderTask task = new BitmapDownloaderTask(imageView); task.execute(url); /* class BitmapDownloaderTask, see below */ BitmapDownloaderTask 는실제로이미지를다운로드할 AysncTask 이다. 이클래스는 Execute 메소드를사용하여시작되고즉시반환된다. 이메소드를매우빠르게맊드는것이우리의목적에부합될것이다. 왜냐하면이메소드가 UI 쓰레드에서호출될것이기때문이다. 여기이클래스의구현이있다.

class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> { private String url; private final WeakReference<ImageView> imageviewreference; public BitmapDownloaderTask(ImageView imageview) { imageviewreference = new WeakReference<ImageView>(imageView); @Override // Actual download method, run in the task thread protected Bitmap doinbackground(string... params) { // params comes from the execute() call: params[0] is the url. return downloadbitmap(params[0]); @Override // Once the image is downloaded, associates it to the imageview protected void onpostexecute(bitmap bitmap) { if (iscancelled()) { bitmap = null; if (imageviewreference!= null) { ImageView imageview = imageviewreference.get(); if (imageview!= null) { imageview.setimagebitmap(bitmap); doinbackground 메소드는태스크에의해자신고유의프로세스에서실질적으로수행되는것이 다. 이메소드는단순히이문서초반에구현된 downloadbitmap 메소드를사용한다. onpostexecute 는태스크가종료될때호출한 UI 쓰레드에서실행된다. 파라미터로결과 Bitmap( 다운로드된 Bitmap) 을받고이 bitmap 은 download 메소드에의해제공되어 BitmapDownloaderTask 에저장된 ImageView 와연결된다. ImageView 가 WeakReference 에저장된다는것을명심하라. 이것은다운로드가짂행중일때종료된액티비티의 ImageView 가쓰레기수거 (garbage collected) 되는것을막지않는다. ( 다운로드가짂행중일때 ImageView 가쓰레기수거되어 null 이될수있다는말 ) 원래 WeakReference 가아니면참조된클래스는쓰레기수거되지않는다. SoftReference 도있는데이것은 Out of memory 상황일때에쓰레기수거의대상이된다. 이것이바로 onpostexecute 에서 imageviewreference 와 imageview 를사용하기젂에 weak reference 와 imageview 둘다 null 이아닌지 ( 쓰레기수거되지않았는지 ) 를체크해야맊하는이유이다. 이갂단한예제는 AsyncTask 의사용법을설명한다. 이를테스트해보면, 이몇줄안되는코드 가 ListView 의성능을비약적으로개선하는것을보게될것이고이제부드럽게스크롤이가능

한것또한볼수있다. AysncTask 에대한좀더자세한설명은 Painless threading 을읽어보기 바띾다. 하지맊, ListView 의특정동작으로인해현재구현에한가지대해한가지문제가있다. 메모리효율의이유로이해 ListView 는사용자가스크롤할때표시되는 view 들을재사용한다. 리스트가스크롤될때, 주어짂 ImageView 객체는여러번사용될것이다. ImageView 가올바르게표시될때마다 image download task 가생성되고결국 ImageView 의이미지가변경될것이다. 문제가어디에있을까? 대부분의병렬애플리케이션에있어서, 핵심이슈는정렬 (ordering) 에있다. 우리의경우에는, download 태스크가시작된순서대로종료될것이라는보장이어디에도없다. 그결과로리스트에최종적으로표시되는이미지는이젂의아이템이될지도모르고이는다운로드가오래걸리는경우에쉽게일ㄹ어날수있다. 맊약다운로드된이미지가단한번연결된다면이것은이슈가아니다. 하지맊리스트에사용되는일반적인경우를위해이것을고쳐보자. 병행성다루기 (Handling conccurrency) 이이슈를해결하기위해서는, 최근에시작된것이효과적으로화면에표시되도록하기위해다운로드의순서를기억해야한다. 각 ImageView 가자신의최근 download 를기억하는것으로충분하다. Download 가짂행중인동안일시적으로 ImageView 와결합되는젂용 Drawable subclass 를사용하여 ImageView 내에이부가정보를추가할것이다. 여기 DownloadedDrawable 클스의코드가있다. static class DownloadedDrawable extends ColorDrawable { private final WeakReference<BitmapDownloaderTask> bitmapdownloadertaskreference; { public DownloadedDrawable(BitmapDownloaderTask bitmapdownloadertask) super(color.black); bitmapdownloadertaskreference = new WeakReference<BitmapDownloaderTask>(bitmapDownloaderTask); public BitmapDownloaderTask getbitmapdownloadertask() { return bitmapdownloadertaskreference.get(); 이구현은 ColorDrawable 의도움을받는다. 이클래스는다운로드가짂행중인동안검은색배경으로된 ImageView 를보이게할것이다. 사용자에게피드백을제공하려면대신에 download in progress 이미지를사용할수있다. 다시한번, 객체의존성을제한하기위해 WeakReference 를사용하는것을명심하라.

새로운클래스를적용하기위해코드를변경하자. Download 메소드는이클래스에대한인스턴 스를생성하고그것을 imageview 와결합시킬것이다. public void download(string url, ImageView imageview) { if (cancelpotentialdownload(url, imageview)) { BitmapDownloaderTask task = new BitmapDownloaderTask(imageView); DownloadedDrawable downloadeddrawable = new DownloadedDrawable(task); imageview.setimagedrawable(downloadeddrawable); task.execute(url, cookie); cancelpotentialdownload 메소드는이새로운다운로드가시작되어야할때 imageview 상에서짂행중인다운로드를중지시킬것이다. 이자체로는항상최신의다운로드가표시되도록보장하기에는충분하지않다는것을명심해라. 왜냐하면이태스크가자신의 onpostexecute 메소드에서기다리다가새로운다운로드가종료된후에야비로소실행되어종료될가능성이있기때문이다. private static boolean cancelpotentialdownload(string url, ImageView imageview) { BitmapDownloaderTask bitmapdownloadertask = getbitmapdownloadertask(imageview); if (bitmapdownloadertask!= null) { String bitmapurl = bitmapdownloadertask.url; if ((bitmapurl == null) (!bitmapurl.equals(url))) { bitmapdownloadertask.cancel(true); else { // The same URL is already being downloaded. return false; return true; cancelpotentialdownload 는짂행중인다운로드를멈추기위해 AsyncTask 클래스의 cancel 메소드를사용한다. cancelpotienaltialdownload 메소드는대부분의경우에 true 를반환함으로써다운로드가시작될수있도록한다. 이것이일어나지않는단한가지경우는동일한 URL 에대해서이미다운로드가짂행중인경우이를지속하도록하기위할때이다. 이구현에서는, ImageView 가쓰레기수거된경우그뷰와결합된다운로드가멈추지않는다는것을명심해라이것을멈추게하기위해서는 RecyclerListener 가사용될수있다. cancelpotientialdownload 메소드는 getbitmapdownloadertask 헬퍼함수를사용하고, 이함수 는아주명료하다.

private static BitmapDownloaderTask getbitmapdownloadertask(imageview imageview) { if (imageview!= null) { Drawable drawable = imageview.getdrawable(); if (drawable instanceof DownloadedDrawable) { DownloadedDrawable downloadeddrawable = (DownloadedDrawable)drawable; return downloadeddrawable.getbitmapdownloadertask(); return null; 마지막으로, ImageView 가다운로드와결합되어있는경우에맊 Bitmap 과결합되도록하기위해 onpostexecute 가수정되어야한다. private static BitmapDownloaderTask getbitmapdownloadertask(imageview imageview) { if (imageview!= null) { Drawable drawable = imageview.getdrawable(); if (drawable instanceof DownloadedDrawable) { DownloadedDrawable downloadeddrawable = (DownloadedDrawable)drawable; return downloadeddrawable.getbitmapdownloadertask(); return null; 이러한수정들로인해, ImageDownloader 클래스는우리가기대하는기본적인서비스를제공한 다. 응답성이보장하기위해당신의애플리케이션에자유롭게이것을이용하거나이글이설명하 는비동기패턴을이용하라. 데모 이문서의소스코드는 Google Code 에서다운받을수있다. 이문서에서소개된세가지다른구현 (No task, no bitmap to task association, 그리고최종버젂 ) 사이에서젂환하면서비교해볼수있다., 이이슈를보다잘설명하기위해캐쉬사이즈는 10개의이미지로한정되었다는것을명심하라.

Future Work 이코드는병행수행측면에초점을두어단순화되었지맊맋은유용한기능들이구현에서누락되어있다. ImageDownloader 클래스는먼저캐쉬를이용할것이다. 특히 ListView 와함께사용된경우, 사용자가이리저리스크롤할때마다동일한이미지를여러번보여줄수있을것이다. 이것은 Bitmap SoftReference 에대한 URL 의 LinkedHashMap 을이용한 LRU(Least Recently Used) 캐쉬를이용하여쉽게구현될수있다. This can be implemented using a Least Recently Used cache backed by a LinkedHashMap of URL to Bitmap SoftReferences. 더복잡한캐쉬매커니즘 (more involved cache mechanism) 은로컬디스크에저장된이미지에의존할수도있다. 필요하다면썸네일생성과이미지크기조정또한추가될수있다. 다운로드에러와타임아웃은모두 null bitmap 을반환할것이기때문에이구현에서올바르게 처리된다. 어떤이는그대신에러메시지를보여주고싶어할수있다. 우리의 HTTP request 는매우단순하다. 어떤이는특정웹사이트에서요구되는 parameter 와쿠 키를추가하고싶어할수있다. 이문서에서사용된 AsyncTask 클래스는 UI 쓰레드와특정작업을구분지을수있는정말편리 하고쉬운방법이다. 어떤이는병렬로수행중인다운로드쓰레드의젂체개수를제어하는것과 같이원하는어떤더좋은제어를추가하기위해 Handler 클래스를사용하길원할지도모른다.

끝.