Как вызывать действия из неинформационной темы?

У меня есть шаблон Observer Design, который использует Thread для отправки моих собственных Events . Иногда классы, которые называются, – это Android-действия, а в других случаях они являются обычными классами. Код в потоке НЕ является активностью.

Я получил эту ошибку:

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

Чтобы избежать этой ошибки во время выполнения, мне пришлось добавить Looper.prepare() внутри Thread. Я знаю об этом сообщении: не удается создать обработчик внутри потока, который не вызвал Looper.prepare (), он содержит лучшую информацию для такого рода проблем, но все же я не знаю, как интегрировать ответ mjosh в мой Нить.


проблема

Вызов из потока в действие никогда не происходит. В отдельности этот код работает, но не тогда, когда «Действия» ждут вызова.

Этот класс отправит события другим классам. Это работает с потоком.

 public class EventBus { // Non essential code here. ... // Thread code. private class MyThread implements Runnable { @Override public void run() { while(true) { synchronized(list) { for(Observer o : list) // Execution transfers to Activity here. o.handleEvent(event); } } } } } в public class EventBus { // Non essential code here. ... // Thread code. private class MyThread implements Runnable { @Override public void run() { while(true) { synchronized(list) { for(Observer o : list) // Execution transfers to Activity here. o.handleEvent(event); } } } } } 

Внутри мероприятия.

 public class FirstActivity extends Activity implements Observer { public void handleEvent() { // Never gets here. } } 

Итак, как я могу решить эту проблему? В моем приложении будет много действий и много регулярных занятий.

Решить мою проблему

Мне нужен способ сохранить мой поток в живых и сделать призывы к действиям. Это может быть смесь добавления некоторого кода в поток, чтобы он мог успешно отправлять мои вызовы в действия.

Хотя я не программирую Android, я полагаю, что это не может быть так сложно сделать, что вы хотите здесь. Из ответа, приведенного в вашем связанном вопросе, проблема заключается в том, что у вас будут наблюдатели, которые могут быть или не быть Деятельностью. Вы не можете просто обработать событие по активности из-за характера модели Threading Activity. Для деятельности вам необходимо выполнить действие в потоке пользовательского интерфейса. Это звучит довольно быстро. Используя POJO, я собрал SSCCE ниже. Единственная часть, которая действительно представляет большой интерес, – это кастинг, который происходит в цикле EventBus.

 public class Test { public static void main(String[] args) throws InterruptedException { //create the thread to demonstrate execution MyThread t = new MyThread(); //add a non activity observer t.addObserver(new NonActivityObserver()); //add an activity observer t.addObserver(new ActivityDecendent()); //fire off the thread new Thread(t).start(); //give us time to read the output Thread.sleep(Long.MAX_VALUE); } public static class MyThread implements Runnable { private ArrayList<Observer> list = new ArrayList<Observer>(); public void addObserver(Observer arg0) { synchronized (list) { list.add(arg0); } } @Override public void run() { //no loop just doing this once for example synchronized(list) { for(final Observer o : list) { //first try to cast to an Activity try { Activity act = (Activity)o; //if we get here, its an activity //so invoke on its UiThread act.runOnUiThread(new Runnable() { @Override public void run() { Event event = new Event("From the activity's runOnUiThread method"); o.handleEvent(event); } }); } catch (Exception e) { //if we got here, the class is not an activity //so it should be safe to just handle the event //on this thread Event event = new Event("From observers handle event method"); o.handleEvent(event); } } } } } //your observer interface public static interface Observer { public void handleEvent(Event e); } //Your Event class public static class Event { private String message; public Event(String message) { this.message = message; } public void talk() { System.out.println(message); } } //An observer which isnt an activity public static class NonActivityObserver implements Observer { @Override public void handleEvent(Event e) { e.talk(); } } //An activity which implements Observer public static class ActivityDecendent extends Activity implements Observer { @Override public void handleEvent(Event e) { e.talk(); } } //An Activity public static class Activity { //pretend this is the Android activity executing this runnable //on the UI thread public void runOnUiThread(Runnable r) { new Thread(r).start(); } } } 

И выход:

 From observers handle event method From the activity's runOnUiThread method 

Это решение относится к вашему делу, что отстойно … но я думаю, что это должно сработать.