2014-02-10 2 views
1

В настоящее время я пытаюсь показать тост от IntentService, если устройство обнаруживает акселерометр. Для этого я искал и узнал, что могу реализовать обработчик. Однако он не совсем работает. Код компилируется и запускается на эмуляторе без какой-либо ошибки, но тост не отображается. Мне было интересно, не могу ли я помочь найти ошибки в моем коде. Код показан ниже.Тост из 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/intentservice-wont-show-toast?rq=1 – marcinj

+0

Лог, если выполняется runnable & try getBaseContext() как параметр контекста – Sam

+0

@ marcin_j: Я не уверен, что решение предложенного сообщения является правильным. Ссылка IntentService упоминает, что метод onStartCommand не перезаписывается. Кроме того, весь смысл использования Handler заключается в том, что IntentService работает в разных потоках и работает. – ElectroJunkie

ответ

1

Создание обработчика для сообщений Тост в onHandleIntent связывает его с неправильной резьбой:

Этот метод вызывается на рабочем потоке с просьбой обработать.

Либо явно установить нить обработчика, с, например, new Handler(getMainLooper()) или создать обработчик в onCreate.

Смежные вопросы