[안드로이드 공부]/동기화 12

[안드로이드] java.lang.IllegalStateException: Cannot execute task: the task is already running.

AsyncTaks를 아래 방법으로 호출 하면 두 번 실행 하게 되는 효과를 발휘 한다. aAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR).executor(params); java.lang.IllegalStateException: Cannot execute task: the task is already running. aAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params) 요렇게 바꿔 줘야 한다.

[안드로이드] Performing stop of activity that is not resumed

안드로이드 액티비티 포즈시에 아래와 같은 에러가 발생 한다면 Performing stop of activity that is not resumed @Override public void onPause() { super.onPause(); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { abcdefg(); } }, 100); } 포즈시 오래 걸리는 작업은 위와 같이 좀 지연을 시키면 된다.

안드로이드 비동기 태스크 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 Override 에서 발생하는 문구에 대해 보겠다. 그냥 답만 내 놓자. onCreateView를 통해 1개만 만든다면 문제 없지만, 여기에다가 onCreateDialogView까지 만들게 되면 다음에 뷰를 띄울 때는 반드시 죽여야 한다. 그러지 않으면 아래 뻘건 문구와 함께 앱이 죽어 있을 것이다. java.lang.IllegalStateException: The specified child already has a parent. You must call removeView(..

백그라운드 리소스를 비 동기 태스크에서 사용하기

BackgroundResource를 asyncTask에서 사용할 때는 반드시 onPostExecute 또는 onProgressExcute 에서 사용 하도록 하자. doInBackground에서 사용 할 경우에는 시스템이 스레드를 돌면서 BackgroundResource를 해결 하러 다니는데... 따로 스레드를 돌려서 사용하면 죽는다. 시스템이 하는 일은 스레드에서 하지 말자. 아빠가 하는일은 아빠가 하도록 하자.

스레드 엄마의 심폐 소생술에... 로이드가

프로그래스 다이얼로그는 스레드 엄마가 품어줘야 비로소 새 생명이 태어 날 수 있는 조건이 갖추어진다. 즉, 스레드 엄마가 제대로 품지 않으면 언제든지 넘어져서 다치고 떨어져서 죽을 수도 있다. 여기서 '엄마가' 그리고 '제대로'가 참 중요하다. 무슨말이냐? 안드로이드의 우주 속에는 수 많은 스레드 엄마들이 새끼들을 키우고 살고 있는데... 아빠가 술먹고 집으로 돌아오다가 옆집 애가 뛰어노는 모습을 보고, 자기 자식인줄 알고 집으로 데리고 왔다면? 안드로이드 우주에선 엄마들이 자기 애가 아니면 그냥 밖으로 던져 버린다. 즉, 사망이다. 여기서 알고 넘어가야 할 것은? 1. 아빠도 누가 우리 자식인지 알아야 애를 잘 데려 와서 키울 것이고2. 엄마도 애가 멀리 나가서 다른 자식과 햇갈리지 않도록 해야 한다는..