Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在自己的网络任务中有一个长期运行的服务_Android_Multithreading - Fatal编程技术网

Android 在自己的网络任务中有一个长期运行的服务

Android 在自己的网络任务中有一个长期运行的服务,android,multithreading,Android,Multithreading,因此,我的意图如下: 我需要一个后台服务,它主要从主UI接收发送请求(UDP),并等待其响应,然后将响应发送回主UI。这是一个相当同步的过程。但另外,我希望服务等待可以在网络上随时接收到的异步消息,例如,网络客户端希望通知我或报告错误。 实现这一点的最佳方式是什么? 对于IPC来说,Messenger类可以用来处理数据。 它可以像这里的“远程Messenger服务示例”那样实现吗 非常感谢您的帮助。在我的项目中,我有一个永久运行的服务 我也在这个服务中创建了3个线程,所以都在后台。它们中的每一个

因此,我的意图如下: 我需要一个后台服务,它主要从主UI接收发送请求(UDP),并等待其响应,然后将响应发送回主UI。这是一个相当同步的过程。但另外,我希望服务等待可以在网络上随时接收到的异步消息,例如,网络客户端希望通知我或报告错误。 实现这一点的最佳方式是什么? 对于IPC来说,Messenger类可以用来处理数据。 它可以像这里的“远程Messenger服务示例”那样实现吗


非常感谢您的帮助。

在我的项目中,我有一个永久运行的服务

我也在这个服务中创建了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到目前为止。如果你有任何编码的例子让我知道。好的,如果手机处于待机状态,我假设用户不关心收到的数据。当我从待机状态恢复时,线程是否也会恢复?我的意思是,线程不会被破坏,对吗?是的,当手机从待机状态唤醒时,线程会恢复。过一会儿发布一些代码片段。。。