我正在尝试Android上的一些新功能,需要访问UI线程的处理程序。
我知道以下几点:
- UI线程具有自己的处理程序和循环程序
- 任何消息都将放入UI线程的消息队列中
- 循环程序拾取事件并将其传递给处理程序
- 处理程序处理消息并将特定事件发送到UI
我想拥有必须获取UI线程处理程序并将消息放入此处理程序的服务。这样就可以处理此消息并将其发布到UI。在这里,该服务将是由某些应用程序启动的普通服务。
我想知道这是否可能。如果是这样,请提出一些代码段,以便我可以尝试。
关于吉里什
我正在尝试Android上的一些新功能,需要访问UI线程的处理程序。
我知道以下几点:
我想拥有必须获取UI线程处理程序并将消息放入此处理程序的服务。这样就可以处理此消息并将其发布到UI。在这里,该服务将是由某些应用程序启动的普通服务。
我想知道这是否可能。如果是这样,请提出一些代码段,以便我可以尝试。
关于吉里什
Answers:
此代码段构造了一个与主(UI)线程关联的Handler:
Handler handler = new Handler(Looper.getMainLooper());
然后,您可以在主(UI)线程中发布要执行的内容,如下所示:
handler.post(runnable_to_call_from_main_thread);
如果处理程序本身是从主(UI)线程创建的,则为简洁起见,可以省略该参数:
Handler handler = new Handler();
有关进程和线程的《Android开发指南》提供了更多信息。
Handler
,则无法访问AFAIK。
ViewRoot
Android SDK中没有AFAICT。
Handler
/ Messenger
,尽管我将全部替换为事件总线(例如,greenrobot的EventBus)。
您可以通过广播接收器获取值……如下所示,首先创建自己的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);
最后,在onDestroy()中取消注册BroadcastReceiver为,
unregisterReceiver(broadcastReceiver);
现在最重要的部分...您需要从任何需要发送值的地方触发广播.....
Intent i=new Intent();
i.setAction("YOUR_INTENT_FILTER");
i.putExtra("KEY", "YOUR_VALUE");
sendBroadcast(i);
....欢呼:)
解:
Handler
with Looper
:responseHandler和override handleMessage
方法Runnable
任务内部,在responseHandler上调用sendMessagesendMessage
在ResponseHandler所的handleMessage的结果调用。Message
并进行处理,更新UI样例代码:
/* 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);
}