Android 在自己的网络任务中有一个长期运行的服务
因此,我的意图如下: 我需要一个后台服务,它主要从主UI接收发送请求(UDP),并等待其响应,然后将响应发送回主UI。这是一个相当同步的过程。但另外,我希望服务等待可以在网络上随时接收到的异步消息,例如,网络客户端希望通知我或报告错误。 实现这一点的最佳方式是什么? 对于IPC来说,Messenger类可以用来处理数据。 它可以像这里的“远程Messenger服务示例”那样实现吗Android 在自己的网络任务中有一个长期运行的服务,android,multithreading,Android,Multithreading,因此,我的意图如下: 我需要一个后台服务,它主要从主UI接收发送请求(UDP),并等待其响应,然后将响应发送回主UI。这是一个相当同步的过程。但另外,我希望服务等待可以在网络上随时接收到的异步消息,例如,网络客户端希望通知我或报告错误。 实现这一点的最佳方式是什么? 对于IPC来说,Messenger类可以用来处理数据。 它可以像这里的“远程Messenger服务示例”那样实现吗 非常感谢您的帮助。在我的项目中,我有一个永久运行的服务 我也在这个服务中创建了3个线程,所以都在后台。它们中的每一个
非常感谢您的帮助。在我的项目中,我有一个永久运行的服务 我也在这个服务中创建了3个线程,所以都在后台。它们中的每一个都做了一些工作,也请求http数据:我已经用处理程序完成了这项工作,管理消息队列 这很容易,而且发展良好,增加了项目的规模和复杂性 所以,是的,我应该这样做 注意:如果您必须在后台工作,请记住使用PowerManager获取wake_锁,确保当手机处于待机状态时CPU将保持开启状态(我花了几天时间才明白为什么手机处于待机状态时线程停止工作) 在主线程中,我声明了4个处理程序(2个用于与recordingThread的双边通信,2个用于与sendingThread的双边通信): 然后简单地创建另外2个线程;看看Looper调用:在执行代码时,需要不要让线程死亡,并等待传入消息出现在自己执行过程中创建的处理程序上(在本例中是在run()方法中)。 我还为每个与线程关联的处理程序声明了一个私有类:这样每个线程都有自己的通道来与不同的“操作”进行通信(切换情况)。 还有另一个处理程序,recordingThread处理程序,这里没有显示;但想法是一样的:
private Handler m_recordingThreadHandler, m_sendingThreadHandler,
m_thisRecordingThreadhandler, m_thisSendingThreadHandler;
public void run() {
Looper.prepare();
m_thisRecordingThreadhandler = new UpdRecHandler();
m_recordingThread = new RecordingThread(m_mainThreadContext,
m_thisRecordingThreadhandler, m_configuration, m_picturesDir);
m_recordingThread.setName("recordingThread");
m_recordingThread.start();
m_thisSendingThreadHandler = new UpdSenHandler();
m_sendingThread = new SendingThread(m_mainThreadContext,
m_thisSendingThreadHandler, m_configuration);
m_sendingThread.setName("sendingThread");
m_sendingThread.start();
Looper.loop();
}
private class UpdRecHandler extends Handler {
@Override
public void handleMessage(Message msg) {
Message m;
switch (msg.what) {
case Utils.SEND_THIS_THREAD_HANDLER:
Log.i(TAG, "Ricevuto Handler di recordingThread.");
m_recordingThreadHandler = (Handler) msg.obj;
m_recordingThreadReady = true;
checkForAllThreadsReady();
break;
case Utils.FORCE_RESET:
Log.i(TAG,
"RecordingThread ha compeltato la procedura per il reset.");
m_recordingThreadResetted = true;
checkForThreadsResetted();
break;
...more cases...
}
此代码来自recordingThread类。
一旦创建,就会执行run方法,在这个方法中,我将这个线程的处理程序传递给主线程(前面看到的代码),这个处理程序是在这个run()方法中创建的:通过这种方式,我启用了双边通信。
同样,在recordingThread中,我为处理程序创建了一个私有类。我再次调用了Looper,以便在执行run方法后让线程处于活动状态
public void run() {
Looper.prepare();
Log.i(TAG, "In esecuzione, mando il mio handler a updateThread");
m_thisThreadHandler = new RecUpdHandler();
m_mainThreadHandler.obtainMessage(Utils.SEND_THIS_THREAD_HANDLER,
m_thisThreadHandler).sendToTarget();
Looper.loop();
}
private class RecUpdHandler extends Handler {
public void handleMessage(Message msg) {
Message m;
switch (msg.what) {
case Utils.TAKE_PHOTO:
...do work....
break;
case Utils.UPDATE_CONFIGURATION:
... do other work...
break;
}
如果要让线程终止,只需杀死与该线程关联的循环器,操作如下:
Looper.myLooper().quit();
请记住,处理程序会自动关联到创建它的线程:如果处理程序A是在线程T1中创建的,那么可以将A的引用传递给T2和T3。然后,这些线程能够将消息发送到T1,但不能发送到viceversa。
这是因为我已经创建了4个处理程序,用于支持双向通信。Thx到目前为止。如果你有任何编码的例子让我知道。好的,如果手机处于待机状态,我假设用户不关心收到的数据。当我从待机状态恢复时,线程是否也会恢复?我的意思是,线程不会被破坏,对吗?是的,当手机从待机状态唤醒时,线程会恢复。过一会儿发布一些代码片段。。。