Доступ к обработчику потоков пользовательского интерфейса из службы

Я пытаюсь что-то новое на Android, для которого мне нужно получить доступ к обработчику потока пользовательского интерфейса.

Я знаю следующее:

  • В потоке пользовательского интерфейса есть собственный обработчик и петлитель
  • Будет отправлено любое сообщение в очередь сообщений в пользовательском интерфейсе поток
  • Петлеер забирает событие и передал его обработчику
  • Обработчик обрабатывает сообщение и отправляет specfic-событие в пользовательский интерфейс

Я хочу иметь свою службу, которая должна получить обработчик потока пользовательского интерфейса и поместить сообщение в этот обработчик. Так что это сообщение будет обработано и будет выдано пользовательскому интерфейсу. Здесь услуга будет обычной услугой, которая будет запущена с помощью какого-либо приложения.

Я хотел бы знать, возможно ли это. Если да, предложите несколько фрагментов кода, чтобы я мог попробовать.

Отношения Гириш

Ответ 1

Этот фрагмент кода создает обработчик, связанный с потоком основного (UI):

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

Затем вы можете публиковать материал для выполнения в основном потоке (UI), например:

handler.post(runnable_to_call_from_main_thread);

Если сам обработчик создается из основного (UI) потока, аргумент может быть опущен для краткости:

Handler handler = new Handler();

Руководство разработчика Android о процессах и потоках содержит больше информации.

Ответ 2

Создайте объект Messenger, прикрепленный к вашему Handler, и передайте Messenger в Service (например, в Intent extra для startService()). Затем Service может отправить Message в Handler через Messenger. Вот пример приложения, демонстрирующий это.

Ответ 3

В настоящий момент я предпочитаю использовать библиотеку событийных событий, такую ​​как Otto для этой проблемы. Просто подпишите нужные компоненты (активность):

protected void onResume() {
    super.onResume();
    bus.register(this);
}

Затем укажите метод обратного вызова:

public void onTimeLeftEvent(TimeLeftEvent ev) {
    // process event..
}

а затем, когда ваша служба выполнит такой оператор:

bus.post(new TimeLeftEvent(340));

Этот POJO будет передан вашему вышеуказанному действию и всем другим компонентам подписки. Простой и элегантный.

Ответ 4

Вы можете получать значения через широковещательный приемник...... следующим образом: сначала создайте свой собственный IntentFilter как,

Intent intentFilter=new IntentFilter();
intentFilter.addAction("YOUR_INTENT_FILTER");

Затем создайте внутренний класс BroadcastReceiver как,

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    /** Receives the broadcast that has been fired */
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction()=="YOUR_INTENT_FILTER"){
           //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW///////////
           String receivedValue=intent.getStringExtra("KEY");
        }
    }
};

Теперь зарегистрируйте свой широковещательный приемник в onResume() как,

registerReceiver(broadcastReceiver, intentFilter);

И, наконец, Unregister BroadcastReceiver в onDestroy() как,

unregisterReceiver(broadcastReceiver);

Теперь самая важная часть... Вам нужно запустить широковещательную рассылку туда, где вам нужно отправить значения..... так, как,

Intent i=new Intent();
i.setAction("YOUR_INTENT_FILTER");
i.putExtra("KEY", "YOUR_VALUE");
sendBroadcast(i);

.... приветствия:)

Ответ 5

Решение:

  • Создайте Handler с Looper от главной темы: requestHandler
  • Создайте Handler с Looper из главного потока: responseHandler и переопределите handleMessage метод
  • отправить Runnable task on requestHandler
  • Внутри задачи Runnable вызовите sendMessage для responseHandler
  • Этот sendMessage вызывает вызов handleMessage в responseHandler.
  • Получить атрибуты из Message и обработать его, обновить интерфейс

Пример кода:

    /* Handler from UI Thread to send request */

    Handler requestHandler = new Handler(Looper.getMainLooper());

     /* Handler from UI Thread to process messages */

    final Handler responseHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {

            /* Processing handleMessage */

            Toast.makeText(MainActivity.this,
                    "Runnable completed with result:"+(String)msg.obj,
                    Toast.LENGTH_LONG)
                    .show();
        }
    };

    for ( int i=0; i<10; i++) {
        Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                   /* Send an Event to UI Thread through message. 
                      Add business logic and prepare message by 
                      replacing example code */

                    String text = "" + (++rId);
                    Message msg = new Message();

                    msg.obj = text.toString();
                    responseHandler.sendMessage(msg);
                    System.out.println(text.toString());

                } catch (Exception err) {
                    err.printStackTrace();
                }
            }
        };
        requestHandler.post(myRunnable);
    }