반응형

이번 포스팅은 AsyncTask를 중간에 중지하는 방법에 대하여 알아보도록 하겠습니다.


  Asynctask변수.cancel(true);


 - 만약 HttpClient를 사용중이라면

       httpClient.getConnectionManager().shutdown();


- 만약 dialog를 사용중이라면 

  dialog의 OnCancelListener 에서 위의 명령어 사용


- onPreExecute() 함수는 Thread로 동작하지 않고, Main Thread에서 동작하는 부분이라서 본문에 넣어 주신 코드 같은 경우는 AsyncTask execute 하는 경우 정상적으로 처리 되었다는 onPostExecure() 콜백 함수가 호출이 됩니다.

- AsyncTask 의 경우 doInBackground() 콜백 함수가 Thread에서 동작하는 부분이며, doInBackground() 가 동작 중에 AsyncTask cancel을 하는 경우  doInBackground() 함수 로직이 완료 된 뒤에 onCancelled() 콜백이 호출이 되도록 되어 있습니다. 


- AsyncTask cancel 을 호출 하지 않은 경우에는 doInBackground() 함수 로직 완료 후 onPostExecure() 콜백이 호출이 되구요. 

@Override
protected Void doInBackground(Void... params) {
    int count = 0;
    while( !isCancelled() && count < 10 ) {
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
              ++count; 
      }
        return null;
}


- AsyncTask에서 위와 같이 doInBackground 를 오버라이드를 하시면 캔슬 하였을 때 onCancelled 콜백이 호출 될꺼에요.


저 AsyncTask의 주요한 세가지 동작에 대해서 알아야 합니다.



1.onPreExecute(): Background 작업 시작전에 UI 작업을 진행을 합니다. 

2.doInBackground(): Background 작업을 진행을 합니다. 

3.onPostExecute(): Background 작업이 끝난 후 UI 작업을 진행합니다. 


- AsyncTask의 숨겨진 문제점 


안드로이드에서 AsyncTask 를 소개할 당시에 ‘문제점 없는 Threading’ 이란 제목이 붙어졌고. 이것은 성공적 인듯 보였지만 완벽 하지 않았습니다. AsyncTask는 UI Thread 와 쉽게 상호 작용 하는 목적을 가지고 있습니다. 하지만 몇몇 경우에서는 AsyncTask는 묘책이 아니에요. 정확하게 알지 못하고, 맹목적으로 AsyncTask를 사용하게 된다면 그 것을 제대로 구현할 수 없습니다. 

또한 문제가 발생될 수 있다. 


문제: 

AyncTask의 목표는 백그라운드에서 UI Thread와의 상호 작용을 쉽게 하는 것이다.

 

그러므로 onPostExecute가 완료 될때까지 많은 UI thread간의 부분적인 업데이트가 실시간으로 이루어집니다. 

화면전환이 일어날 때 이러한 동작은 매우 큰 작업입니다.

 

App 전환이 일어날때 전체의 Activity는 파괴되고, 재생성이 됩니다.

Activity가 재시작 할 때 실행했던 AsyncTask의 reference의 Acitvity는 invalid 하며,  onPostExecute는 새로운 Activity에 아무런 영향을 미치지 못합니다.

 

이것은 AsyncTask의 Activity에 의해 현재 Activity의 잠재적인 referencing에 문제가 발생했다는 것입니다. 



해결: 

보통의 해결책은 속성 변경이나 target Activity의 재시작으로 인한 업데이트를 하는 AsyncTask의 reference 꽉 잡고 있는 것이다.

 

 또다른 다양한 해결 방법은 global holder(전역변수??)를 사용하거나 Activity.onRetainNonConfigurationInstance() 를 사용하는 것입니다. Fragment 에 기초된 시스템을 위해 남은 Fragment들을 AsyncTask에 저장할 수 있습니다. 




- AsyncTask 와 Lifecycle: 

AsyncTask의 dead가 Activity에 원래 이러한 영향을 미치는 것은 아닙니다. AsyncTask는 장시간 사용하면서 문제가 발생합니다.

 

 AyncTask를 예정보다 빨리 종료시키는 방법은 AsyncTask.cancel() 사용하는 방법 뿐입니다.

 

- App의 불필요한 백그라운드 tasking 이나 메모리 누수를 막기 위해서는 cancel을 잘 사용 해야 합니다. 


Cancelling AsyncTasks: 

검색 쿼리를 AsyncTask에서 실행해야 한다고 가정합니다. 유저는 검색 파라미터를 AsyncTask가 동작하는 동안 변경하기를 원하고, 그래서 AsyncTask.cancel()을 호출하고 새로운 AsyncTask를 호출했습니다. AsyncTask 완료되었는지 고려하지 않고 cancel을 하거나 그렇지 않을 것입니다. 이것은 mayInterruptIfRunning(실행중인 작업을 취소) 를 하게 될 것입니다. 

무슨 일이 일어나고 있는 것일까요? 



문제는 AsyncTask.cancel() 에 관한 잘못된 개념에 있습니다. 

AsyncTask.cancel() 은 결과를 고려하지 않고 thread를 죽이지 않습니다. 모든 동작은 “취소된” 상태입니다. 

당신이 동작을 중단하기 위해 Asynctask를 취소된 상태로 만들지 만들지는 당신이 알아서 확인 해야 합니다. 




그러므로 두 가지 간단한 솔루션이 있습니다. 

AsyncTask.isCancelled() 을 오랫동안 동작 중일때 확인하거나 thread를 중단을 계속해서 시키는 것입니다. 둘 중 어느 쪽이든 AsyncTask.cancel()을 호출하는 것은 필요한 시간보다 더 많은 시간의 동작을 멈추게 된다. 



앞서 말햇던 것들이 항상은 아니지만 오랜 시간 동안 메소드를 호출한다면 중단 할 수 없습니다. (BitmapFactory.decodeStream()) 이런 상황은 exception이 발생합니다. 

cancel()이 문제 해결책의 전부는 아니다. 




AsynTask의 동시성 한계 

저는 사람들에게 백개의 백그라운드 thread를 돌리도록 권유하지 않습니다. 시작 할 수 있는 AsyncTasks의 숫자를 제한하는 것은 가치 없는 일입니다. 현재 AsyncTask 는 128개의 동시성 task로 제한 되어 있습니다. 큐는 10개의 task로 제한 되어 있습니다. 138개의 task보다 많은 일을 이것들이 완료되기 전에 한다면 당신의 Application은 망가질 것입니다. 저는 Bitmap을 net으로부터 받아오는 과정에서 이런 일이 발생하는 것은 본적 있습니다.

모든 것들이 한번에 실행되지 않도록 백그라운드의 Task들의 갯수를 잘 조절하고. 디자인하며 pool 사이즈를 code스스로 적용되도록 해야 할 것입니다. 




출처 : http://logc.at/2011/11/08/the-hidden-pitfalls-of-asynctask/ 


반응형
반응형

이번 포스팅은 이클립스로 안드로이드를 개발하다 보면 가상머신(에뮬레이터)를 사용하시는 분들을 위해 간단한 팁 하나 가르켜 드리기 위해 작성하였습니다. 


안드로이드 개발을 하다 보면 가상머신(에뮬레이터)를 실행해서 개발해야 하는 경우가 많습니다. 그런데 이 가상머신이 거북이처럼 엄청 느리게 실행됩니다. 


그래서 이 가상머신을 좀 더 빠르게 하는 방법을 알아보도록 하겠습니다.


- Intel CPU를 사용한다면 HAXM(Hardware Accelerated Execution Manager)으로 속도를 개선할 수 있다고 합니다.


- 아래 그림처럼 이클립스 버튼을 눌러 Android SDK Manager를 실행합니다.

 


- Intel x86 Emulator Accelerator (HXAM installer) 항목을 체크합니다.



- 아래 그림 처럼 Android Virtual Device Manager를 실행한 후 가상머신을 만들기 위해 'Create..' 버튼을 클릭합니다.



- 가상머신을 만들 때 중요한 것은 아래 그림처럼 CPU/ABI 항목에 'Intel Atom (x86) 항목을 선택해야 한다는 것과 'Use Host GPU'를 체크해야 한다는 점입니다.



- 위와 같은 방법 대로 하면 가상머신보다 몇 배 빨라진 모습을 볼 수가 있을 겁니다. 하지만 여전히 폰을 가지고 개발하는 것보다는 못 합니다. 최선은 해당 폰을 가지고 개발하는 것이 최선이지만 여건이 여의치 않다면 차선책이라도 쓰자는 마음에 포스팅을 한 거니 아직 잘 모르신 분이 계셨다면 유용한 정보였길 바랍니다.

반응형
반응형

이번 포스팅에서는 ISA(개인종합 자산관리계좌)에 대하여 알아보도록 하겠습니다. ISA는 언론에서 이른 바 '만능통장'이라는 별칭 아래 조금 과장되어 보도 되고 있는 점이 있어 조금이라도 허와 실에 대해 알아볼 것 입니다.


- 우선 ISA에 정의에 대해 알아보도록 하겠습니다. ISA 은행뿐만 아니라 증권사를 통해서도 계설 가능하며 Individual Savings Account의 약자로 하나의 계좌에 예금, 적금, 펀드, 증권, 리츠 등 다양한 상품을 운용할 수 있으며 세제혜택이 있는 금융상품입니다. 


- 한 개의 ISA 계좌에 예금이든 펀드든 여러가지 상품을 담아서 운용하고, 5년 후 계좌 수익을 계산해서 ISA 계좌의 수익이 200만원까지는 비과세로 납세 부분이 발생하지 않고 200만원을 초과하는 수익에 대해서 9.9% 납부하게 되는 분리과세(다른 사업 소득이나 근로소득 등과 합산해서 본인의 소득을 계산하지 않겠다고 이해) 상품입니다. 기존 계좌는 수익을 보면 일반과세 15.4%의 세금을 내야 하지만 ISA 계좌는 이에 비해 수익 200만원까지는 비과세에 그 초과분에 9.9% 분리 과세 되는 부분이 있어 확실히 세제 혜택 부분에서는 큰 강점을 가지고 있습니다.


----------------------------------------------------------

- 예를 들어 ISA 계좌의 세금 부분을 알아보도록 하겠습니다. 

  직장인 A와 B가 각각 ISA 계좌에 10,000만원을 예치(예금, 적금, 펀드, 증권 포함)


  5년후 직장인 A의 ISA 계좌 수익 180만원 발생  

  => 수익 200만원까지는 비과세 이므로 5년 후 수익 180만원 비과세

  

  5년후 직장인 B의 ISA 계좌 수익 450만원 발생  

  => 수익 200만원까지는 비과세 200만원 초과 금액은 9.9%과세이므로 수익 200만원 초과 금액인 250만원에 대해 9.9% 세금을 제외한 2,252,500원을 받을 수 있습니다.       

----------------------------------------------------------


- ISA의 개설조건은 15세 이상 소득이 있는 사람이라면 1인 1계좌 개설이 가능합니다. 다만 직전년도(현재를 기준으로 2015년) 금융소득 2,000만원 이상인 금융소득 종합 과세 대상자는 개설이 불가능합니다.


- ISA 계좌는 연간 2,000만원이하까지 납입을 할 수 있으며, 5년이라는 의무 가입기간을 가지고 있기 때문에 최고 1억까지 납입할 수 있습니다. 그리고 15~29세 청년층에게는 연봉 2,500만원 이하인 사람, 종합소득이 연 1,600만원 이하인 사업자의 경우 3년이라는 의무 가입기간으로 가입 부담이 줄어들게 됩니다.


- 앞서 말씀드렸듯이 ISA의 연간 저축 한도는 연 2,000만원이지만 이미 재형저축이나 소득공제장기펀드에 가입한 사람은 가입한도가 현제 가입액 한도에서 제외되는 점도 유심히 살펴보아야 할 점입니다.


- 이렇게 세제혜택이 있어 금융회사들이 대대적으로 홍보하고 있지만 잘 알려지지 않은 부분이 있습니다. 바로 기존 계좌에는 없는 반면에 ISA 계좌에 있는 ISA 잔액 수수료입니다. ISA계좌를 가지고 있는 사용자라면 ISA 계좌의 금융회사에 계좌잔액의 매년 0.5%의 계좌수수료를 내야 합니다. 오히려 세제 혜택을 보려 하다가 수수료가 더 커서 손해를 볼 수 있기 때문에 꼼꼼이 살펴보고 가입해야 합니다.


----------------------------------------------------------

- 예를 들어 수익과 잔액 수수료에 대해 자세히 알아보겠습니다.


  기존 통장에 1,000만원을 투자해서 연 3%인 30만원의 수익을 보았다고 가정하면

  => 가입자는 일반과세로 수익 30만원의 15.4%인 46,200원을 제한 253,800원을 돌려 받게 됩니다.

  => 연 수입 253,800원


  ISA 계좌에 1,000만원을 투자해서 연 3%인 30만원의 수익을 보았다고 가정하면

 => 가입자는 수익이 200만원 이하기이기 때문에 수익 30만원 세금은 비과세로 면제 되지만 ISA 잔액 수수료 0.05%인 50,000원을 내야 합니다.

 => 연 수입 250,000원 (기존 계좌보다 불리)

----------------------------------------------------------


- ISA 계좌는 연 1,000만원을 투자해서 연4% 수익이 나더라도 요즘 같은 저금리 시대에 연 4% 정도면 수익률이 좋은 편에 속합니다. 우리나라 최고 전문가들이 모인 국민연금도 작년 수익율이 4.5%였으니 그렇게 수익을 내더라도 연4%면 수익이 40만원이고 세제절감분이 최대 6만원 정도에 수수료로 최소 5만원을 내야 한다고 하니 배보다 배꼽이 더 큰 꼴이 될 수 있습니다. 그래서 오히려 일반 가입자는 부디 가입을 하지 않는 것이 좋습니다. 


- ISA는 그럼 어떤 사람들이 가입을 해야 하냐고 궁금한신 분들이 계실텐데요. 이 상품에 꼭 가입해야 하는 사람들은 혼자 힘으로 연 10% 정도의 수익을 낼 수 있는 분들이 가입을 해야 합니다. 이 정도의 수익을 내면 수익에 따른 세제혜택도 많기 때문에 0.05%의 ISA 잔액 수수료로 내더라도 가입자에게 유리합니다.


- 복잡한 ISA의 간단한 특징을 요약해 보겠습니다.


◆ 15세 이상 소득이 있는 사람이라면 1인 1계좌 개설이 가능

◆ 연간 2,000만원이하까지 납입, 5년이라는 의무 가입기간(청년층이나 저소득자는 3년 의무 가입기간)

◆ 연간 저축한도에 기존 재형저축이나 소득공제 장기펀드 가입액 제외

◆ 수익 200만원까지 비과세 그 초과분에 대해 9.9% 분리 과세

◆ 금융회사에 연간 잔액의 0.5% 잔액 수수료

◆ 연 10% 정도의 수익을 낼 수 있는 사람이라면 세제 혜택 때문에 유리

◆ 위의 사항이 적용되지 않는 일반인이라면 부디 가입을 하지 않는 것이 유리


- 요즘 이슈가 되고 있는 ISA에 대해 알아 보았습니다. 

  다음 포스팅에는 좀 더 유익한 정보로 포스팅 하도록 하겠습니다.

반응형

+ Recent posts