Доступ к обработчику потоков пользовательского интерфейса из службы
Я пытаюсь что-то новое на 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);
}