2013-04-05 3 views
0

я хочу, чтобы отправить Broadcast из FromTowerThread со следующим методом:sendBroadcast не работает с WorkerThread

void postToService(final String string){ 
     Handler handler = new Handler(); 
     handler.post(new Runnable(){ 
      @Override 
      public void run() { 
       context.sendBroadcast(new Intent(string)); 
      } 
     }); 
    } 

Мой контекст 'это' (моя служба):

FromTowerThread ftt = new FromTowerThread(this); 

(только для завершенности мой конструктор в FromTowerThread):

public FromTowerThread(Context context){ 
     this.context=context; 
    } 

Я получаю ошибку «не удается создать обработчик внутри threa d, который не вызвал Looper.prepare() ".

Я не знаю, как исправить эту ошибку, все темы, которые я нашел по этой теме, не могли помочь мне понять это.

Заранее благодарен!

Крис

+0

Попробуйте изменить инструкцию Handler handler = new Handler(); Обработчик обработчика = новый обработчик (Looper.getMainLooper()); –

+0

Большое спасибо, Sankar V! Это исправило мою проблему! –

+0

Я добавил его к ответу, примите его, чтобы он мог помочь другим –

ответ

0

изменить заявление

Handler handler = new Handler(); 

в

Handler handler = new Handler(Looper.getMainLooper()); 
0

Я получаю ошибку «не удается создать обработчик внутри потока, который не под названием Looper.prepare()».

Если вы используете Thread, попробуйте вместо этого добавить HandlerThread. У HandlerThread уже есть Looper. (Или вы можете позвонить по телефону Looper.prepare() исамостоятельно в обычную нить.)

В противном случае вы можете сделать несколько вещей, чтобы использовать главный Loop Thread. Например, создайте обработчик в главном потоке и передайте его вашему рабочему потоку или даже передайте представление из потока пользовательского интерфейса и вызовите view.post(Runnable) для выполнения Runnable в потоке пользовательского интерфейса.

0

Сообщение может быть сделано только из обработчика в потоке, который называется Looper.prepare().

Я предполагаю, что поток, который вызывает void postToService(final String string), представляет собой некоторый тип фоновой темы. Обычно поток пользовательского интерфейса вызывает Looper.prepare(), что означает, что вам нужно будет создать обработчик внутри потока пользовательского интерфейса.

, но только как общее предложение, я уверен, что вы можете просто устранить все это и просто позвонить в эфир сразу:

void postToService(final String string){ 
     context.sendBroadcast(new Intent(string)); 
} 
Смежные вопросы