2013-06-11 5 views
0

나는 코드를 다음과 같이 있습니다안드로이드 진저 브레드가 : Looper.prepare라고하지 스레드 내부 핸들러를 만들 수 없습니다()

final Context context = this; 
Timer timer = new Timer(); 
timer.schedule(new TimerTask() 
{ 
    @Override 
    public void run() 
    { 
     new CheckMessageTask(context).execute(); //ERROR 
    } 
}, 2500, 10 * 60 * 1000); //Every 10 Minutes 

타이머가 CheckMessageTask에게 10 분마다 실행해야합니다. 문제는이 오류가 나타납니다이다

E/AndroidRuntime: FATAL EXCEPTION: Timer-0 
    java.lang.ExceptionInInitializerError 
    at -package-CheckMessageService$1.run(CheckMessageService.java:138) 
    at java.util.Timer$TimerImpl.run(Timer.java:284) 
    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
    at android.os.Handler.<init>(Handler.java:121) 
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
    at android.os.AsyncTask.<clinit>(AsyncTask.java:152) 
    ... 2 more 

CheckMessageTask은 AsyncTask를 확장하고 UI 코드를 실행하지 않기 때문에 그 이유가 아닙니다. 코드는 Android Jelly Bean 4.1.2에서 제대로 작동하지만 Android Gingerbread에서는 제대로 작동하지 않습니다. 어떻게 해결할 수 있습니까?

+0

체크 아웃 : http://stackoverflow.com/a/13267931/1468093 –

답변

1

귀하의 타이머 작업을 사용하는 경우 경우가 다른 스레드에서 실행되는 UI 스레드되지에서 AsyncTask를 실행할 수 없습니다. 당신은 메인 UI 스레드

확인 주제 스레딩 규칙

http://developer.android.com/reference/android/os/AsyncTask.html

AsyncTask 클래스가 UI thread에로드해야합니다 아래 아래 링크를 AsyncTask를로드해야합니다. 이 작업은 JELLY_BEAN부터 자동으로 수행됩니다.

그래서 젤리 빈에서는 잘 작동합니다.

+0

우선 서비스가 백그라운드에서 실행되기 때문에 왜 asynctask가 필요한가요? – Raghunandan

+0

인터넷에 연결하기 때문에 asynctask를 사용하지 않으면 예외가 발생하지 않습니까? – Trojaner

+0

서비스를 사용해 보셨습니까? – Raghunandan

1

당신은 타이머

+0

4.1.2와 함께 작동하는 이유는 무엇입니까? – Trojaner

+0

4.1.2에서이 작업이 자동으로 수행 되었기 때문입니다. AsyncTask 클래스는 UI 스레드에로드되어야합니다. 이것은'JELLY_BEAN' 시점에서'자동적으로 수행됩니다'. – Raghunandan

+0

잘 모르시겠습니까? http://developer.android.com/reference/android/os/AsyncTask.html 섹션 "스레딩 규칙" – pskink