如何在Android中与正在运行的线程通信服务

如何在Android中与正在运行的线程通信服务,android,multithreading,service,communication,Android,Multithreading,Service,Communication,我的目标是提供一种能够满足所有应用程序网络需求的服务 我想也许可以打开两个插座进行数据传输。我希望数据以异步方式处理,所以我想我应该在两个独立的线程中运行它们,每个线程对应每个套接字,这样数据就可以在两个不同的异步“链接”中传输 因此,我希望有两件事: 更好的整体设计。也许我完全搞错了 有人能向我解释一下,一旦我需要向主服务传递数据,我如何与这些THRED进行通信?据我所知(操作系统),我需要使用信号:)(只是开玩笑而已) 这篇文章很好地解释了线程和使用处理程序的通信。同样,同一个博客也有许多关

我的目标是提供一种能够满足所有应用程序网络需求的服务

我想也许可以打开两个插座进行数据传输。我希望数据以异步方式处理,所以我想我应该在两个独立的线程中运行它们,每个线程对应每个套接字,这样数据就可以在两个不同的异步“链接”中传输

因此,我希望有两件事:

  • 更好的整体设计。也许我完全搞错了

  • 有人能向我解释一下,一旦我需要向主服务传递数据,我如何与这些THRED进行通信?据我所知(操作系统),我需要使用信号:)(只是开玩笑而已)

  • 这篇文章很好地解释了线程和使用处理程序的通信。同样,同一个博客也有许多关于Android中各种线程构造的帖子


    另一种可能是使用异步任务。找到一些解释

    好吧,我可以说我终于明白了,就在放弃之前。这是一个超级duper极其简单的应用程序,它在活动中运行一个线程,并为每个实体使用两个不同的处理程序处理双向通信

    守则:

    public class MainActivity extends Activity  {   
    //Properties:   
        private final   String TAG = "Activity";            //Log tag
        private         MyThread mThread;                   //spawned thread 
        Bundle          myB = new Bundle();                 //used for creating the msgs
        public          Handler mHandler = new Handler(){   //handles the INcoming msgs 
            @Override public void handleMessage(Message msg) 
            { 
                myB = msg.getData();
                Log.i(TAG, "Handler got message"+ myB.getInt("THREAD DELIVERY")); 
            } 
        }; 
    //Methods:
        //--------------------------
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);  
            mThread = new MyThread(mHandler);
            mThread.start();
            sendMsgToThread();
        }
        //-------------------------- 
        void sendMsgToThread() 
        { 
            Message msg = mThread.getHandler().obtainMessage(); 
            myB.putInt("MAIN DELIVERY", 321);
            msg.setData(myB);
            mThread.getHandler().sendMessage(msg);
        } 
    }
    //=========================================================================================
    //=========================================================================================
    
    public class MyThread extends Thread{   
    //Properties:
        private final   String TAG = "MyThread";            //Log tag
        private         Handler outHandler;                 //handles the OUTgoing msgs 
        Bundle          myB = new Bundle();                 //used for creating the msgs
        private         Handler inHandler = new Handler(){  //handles the INcoming msgs 
            @Override public void handleMessage(Message msg) 
            { 
                myB = msg.getData();
                Log.i(TAG, "Handler got message"+ myB.getInt("MAIN DELIVERY")); 
            } 
        }; 
    
    //Methods:
        //--------------------------
        public void run(){
            sendMsgToMainThread();  //send to the main activity a msg
            Looper.prepare();
            Looper.loop();
            //after this line nothing happens because of the LOOP!
            Log.i(TAG, "Lost message");
        }
        //--------------------------
        public MyThread(Handler mHandler) {
            //C-tor that get a reference object to the MainActivity handler.
            //this is how we know to whom we need to connect with.
            outHandler = mHandler;
        }
        //--------------------------
        public Handler getHandler(){
            //a Get method which return the handler which This Thread is connected with.
            return inHandler;
        }
        //--------------------------    
        private void sendMsgToMainThread(){
            Message msg = outHandler.obtainMessage();   
            myB.putInt("THREAD DELIVERY", 123);
            msg.setData(myB);
            outHandler.sendMessage(msg);
        }
    }
    //=========================================================================================
    //=========================================================================================
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="test.test.namespace"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk android:minSdkVersion="10" />
    
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".MainActivity" android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    
    我在阅读endian提供的帖子时发现了这一点


    我希望其他人会觉得这很有用。祝你好运:)

    看起来不错。我会看一看,但我确信它掩盖了我需要的一切。10倍!:)嗯,这确实有帮助,但我开始质疑我的孔设计。我将发布另一个关于它的问题。我仍然很困惑。我找不到在服务和线程之间异步传递数据的方法。请使用classi处理程序遵循第一个教程。我仍然不明白线程如何将他的答案发送回主活动。它只显示如何从主活动发送消息:mHandler.sendMessage(msg);在这里找到了一个非常简单简洁的示例:。据我所知,这是一种单向通信,而我正在寻找双向通信。这里的主要问题是,我无法以纯异步方式将MSG发送到活动。这样,如果线程\活动繁忙,MSG可能会丢失。建议?
    01-26 06:25:40.683: I/Activity(19560): Handler got message123
    01-26 06:25:40.683: I/MyThread(19560): Handler got message321