2014-02-10 4 views
1

장치가 가속도계를 감지하면 현재 IntentService에서 건배를 표시하려고합니다. 이를 위해 Handler를 구현할 수있는 방법을 검색하여 배웠습니다. 그러나, 그것은 꽤 작동하지 않습니다. 코드는 오류없이 에뮬레이터에서 컴파일되고 실행되지만 축배는 표시되지 않습니다. 내 코드에서 실수를 찾아내는 데 도움이 될지 궁금합니다. 코드는 아래와 같습니다.onHandleIntent에서 처리기를 만들 때 처리기로 게시 된 IntentService의 토스트가 표시되지 않습니다.

도움이 될 것입니다. onHandleIntent에서 토스트 메시지에 대한 핸들러 만들기

public class AccelService extends IntentService implements SensorEventListener{ 
    private SensorManager mySensorManager; 
    private Handler toastHandler; 

    public AccelService(){ 
     super("AccelerometerIntentService"); 
    } 
    ... 
    private class ToastRunnable implements Runnable{ 
     String toastText; 
     public ToastRunnable(String text){ 
      toastText = text; 
     } 
     @Override 
     public void run(){ 
      Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_SHORT).show(); 
     } 
    } 
    @Override 
    protected void onHandleIntent(Intent intent){ 
     toastHandler = new Handler(); 
     initialize(); 
    } 
    public void initialize(){ 
     mySensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     if(mySensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){ 
      toastHandler.post(new ToastRunnable("Accelerometer Detected!")); 
     } 
    } 
    ... 
} 
+0

http://stackoverflow.com/questions/5346980/intestervice-wont-shast-toast?rq=1 – marcinj

+0

runnable이 실행되면 로그하고 컨텍스트 매개 변수로 getBaseContext()를 시도하십시오 – Sam

+0

@ marcin_j : 나는 너무 확신하지 못합니다. 제안 된 게시물에 대한 해결책은 정확합니다. IntentService 참조는 'onStartCommand'메서드를 덮어 쓰지 않는다고 설명합니다. 또한 IntentService가 다른 스레드에서 그리고 주위의 다른 작업에서 실행 중이기 때문에 Handler를 갖는 전체 요점이 있습니다. – ElectroJunkie

답변

1

잘못된 스레드에 바인딩 :

이 방법은 처리하는 요청과 함께 작업자 스레드에 를 호출된다.

명시 적으로 처리기의 스레드를 new Handler(getMainLooper())과 같이 설정하거나 onCreate에 처리기를 만듭니다.