AsyncTask 5

안드로이드 BroadcastReceiver ANR

브로드 캐스트 리시버 에서는 10 초 이내에 모든 작업을 완료 해야함. 그렇지 않으면 시스템이 죽여 버리거나, ANR을 발생 시킨다. 1. onReceive 에서 최대한 간결하게 코드를 처리 한다.1.1 다른 서비스로 리턴 시킨다.1.2 또는 goAsync()를 사용 하여 타임아웃을 연장 한다. 아래는 구글의 설명이다. /** * This can be called by an application in {@link #onReceive} to allow * it to keep the broadcast active after returning from that function. * This does not change the expectation of being relatively * responsive to..

안드로이드 비동기 태스크 the task has already been executed

안드로이드에서는 비동기적으로 UI 작업을 처리 할 수있도록 asyncTask라는 놈을 제공한다. 하지만, 여러모로 까탈스러운 점이 많으니 조심하자. mTask = new aTask(); if(mTask != null){ mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } 소스를 보면 먼저 태스크를 생성하고 실행 한다. 그러나 만약, if(mTask == null) { mTask = new aTask(); mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }else { mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } 위와 같이 다시 생성 하지 않..

[안드로이드] AsyncTask를 연속으로 사용할 때 문제점

asyncTask를 연속으로 사용할 때 어떤 문제점이 발생 할까? 1. 만약, 1개의 비동기 태스크를 사용한다고 가정 하자.2. 비동기 태스크가 사용자에 의해 계속 호출 된다고 하자.3. 비동기 태스크는 할 일을 다하고 onPost에서 마지막 할일을 마쳐 준다.4. 무슨 문제가 있나? 5. 원래 비동기 태스크의 결과는 항상 onPost에서 얻어오기를 희망 한다. 6. 하지만... 연속으로 비동기태스크를 돌리게 되면 섞이는 경우가 발생한다.7. A가 처음 태스크, B를 두 번째 태스크라고 하자.8. A가 돌고 있는데 B를 실행 했다. 9. A의 onPost가 실행되고 A는 마무리 짓는다. 이것이 정상이다. 하지만10. B가 실행되면서 A의 onPost 이전에 실행 된다. 즉, 끼어든다.11. 하지만.. A..

AsyncTask를 전역으로 쓰면?

안드로이드 AsyncTask를 전역으로 쓴다면? 즉, 재활용 하겠다는 의미인데 가능 할까? 불가능하다! 만약 한 번 쓴 비동기 태스크를 재 활용 하려고 하면 아래문구를 보게 될 것이다. java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once) 즉, 변수 이름은 재활용이 가능 하지만 다시 쓰려면 새로 할당을 받으라는 것이다. 당연한 것 아니겠나? 얼음 얼리는 통을 사서 물을 채우고 얼음을 얼려서 먹었는데, 다음 번에 얼음을 먹으려면 당연히 물을 다시 부어서 넣고 기다려야 먹을 수 있지 않겠는가? 그 당시 얼음 통과 얼음은 그 당시의 내 위장 속..

안드로이드 오버라이드의 비밀과 함정 -Preference

PreferenceActivity의 기본 아이템들은 타이틀, 서머리 또는 체크박스만 있기 때문에 너무 단조롭다. 그래서 안드로이드는 오버라이드해서 내 맘대로 UI를 바꿀수 있도록 제공한다. 결국, 아래 그림처럼 seekbar를 넣어서 좀 더 다이나믹하고 인터랙티비한 형태로 바꿀 수 있다. 방법은1. Preference를 extends 하는 클래스를 하나 만든 다.2. 새로 만든 클래스에서 반드시 onCreateView를 만들어 줘야한다. @Override protected View onCreateView( ViewGroup parent ) { super.onCreateView(parent); mLayoutInFlater = (LayoutInflater) getContext().getSystemServic..