2011-02-14 3 views
2

Hy!Looper.prepare()를 호출하지 않은 스레드에서 처리기를 만들 수 없습니다.

보기를 업데이트 한 끝이없는 스레드가 있습니다.

UpdateState.java :

package android.skiptvad; 

import java.util.List; 

import org.apache.http.NameValuePair; 

import android.os.Handler; 
import android.os.Message; 
import android.text.NoCopySpan.Concrete; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.util.Log; 

public class UpdateState extends Thread { 

    public List<NameValuePair> params; 
    public Handler handler; 

    public UpdateState(List<NameValuePair> params, Handler handler) { 
     this.handler = handler; 
     this.params = params; 
    } 

    @Override 
    public void run() { 

      while (true) 
      { 
       final Handler h = new Handler(){ 
        @Override 
        public void handleMessage(Message msg) { 
         Message msg2 = Message.obtain(); 
         if (msg.obj.toString()!= null) 
         { 
          JSONParse json = null; 
          try 
          { 
            Log.e("Channel_State",msg.obj.toString()); 
            json = new JSONParse(msg.obj.toString()); 
            String state = json.getChannelState(); 
            msg2.obj = state; 
            UpdateState.this.handler.sendMessage(msg); 
          } 
          catch (final Exception e) 
          { 

            e.printStackTrace(); 

          } 
        } 
       } 
       }; 
        HttpConnection con = new HttpConnection(params, "http://surfkid.redio.de/getChannelState", h); 
        con.start(); 
        try { 
         Log.e("Sleep", "Begin"); 
         UpdateState.sleep(5000); 
         Log.e("Sleep", "End"); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         Log.e("Sleep", "Error"); 
         e.printStackTrace(); 
        } 



      //super.run(); 
     } 
    } 
} 

전화 :

Handler hup = new Handler(){ 
       @Override 
       public void handleMessage(Message msg) { 
        Log.e("UPDATE", (String) msg.obj); 
        if (msg.obj.equals("0")&& msg.obj.equals("1")) 
        { 
         tv2.setText("Channel State: "+ msg.obj); 
        } 
        super.handleMessage(msg); 
       } 
      }; 

      UpdateState us = new UpdateState(params, hup); 
      us.start();** 

로그인 : 내 PROB를 해결하는 방법

02-14 07:45:39.690: ERROR/AndroidRuntime(282): Uncaught handler: thread Thread-13 exiting due to uncaught exception 
02-14 07:45:39.690: ERROR/AndroidRuntime(282): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
02-14 07:45:39.690: ERROR/AndroidRuntime(282):  at android.os.Handler.<init>(Handler.java:121) 
02-14 07:45:39.690: ERROR/AndroidRuntime(282):  at android.skiptvad.UpdateState$1.<init>(UpdateState.java:30) 
02-14 07:45:39.690: ERROR/AndroidRuntime(282):  at android.skiptvad.UpdateState.run(UpdateState.java:30) 

흠?

+0

SO에 대한 추가 정보 (예외 메시지를 검색 한 결과 ...) : http://stackoverflow.com/questions/3875184/cant-create-handler-inside-thread-that-has-not-called-looper -frepare –

+0

... 또 다른 하나, 같은 주제, 동일한 google : http://stackoverflow.com/questions/3614663/cant-create-handler-inside-thread-that-has-not-called-looper-prepare- inside-as –

+0

업데이트 된 질문 – user547995

답변

2

오류는 단지 그 내용을 의미합니다. UpdateState 스레드의 run() 방법 안에 new Handler() 전화를 걸고 있습니다. A Handler은 메시지와 실행 파일을 Looper의 이벤트 대기열에 주입하는 데 사용되므로 준비된 Looper가있는 스레드에서 만들어야하는 이유입니다. 정확히 무엇을 성취하려고합니까?

+0

나는 매 5 초마다 인터넷에서 업데이트를 다운로드하는 무한 스레드를 만들고 싶습니다. – user547995

+1

이것을 위해'Timer'와'TimerTask' (또는'ScheduledThreadPoolExecutor'와'Runnable')을보십시오. –

+0

당신은 그냥 activity.runOnUiThread (...)의 내부 핸들러를 호출 할 수 있습니다. – cyrilchampier

관련 문제