【问题标题】:How to communicate a service with a running thread in Android如何在 Android 中与正在运行的线程通信服务
【发布时间】:2012-02-17 20:00:13
【问题描述】:

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

我想可能会打开 2 个套接字进行数据传输。我希望数据被异步处理,所以我想我应该在两个单独的线程中运行它们,每个线程用于每个套接字,这样数据就可以在两个不同的“链接”异步中流式传输..

所以,我很感激两件事:

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

  2. 有人可以向我解释一下,一旦我需要向/从主服务传递数据到/从主服务传递数据,我该如何与这些线程通信?据我所知(操作系统),我需要使用信号:)(开个玩笑..)

【问题讨论】:

  • 在这里找到了一个非常简单明了的示例:androidcookbook.com/…。据我了解,这是一种单向通信,而我正在寻找双向通信..

标签: android multithreading service communication


【解决方案1】:

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

代码:

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>

输出是:

01-26 06:25:40.683: I/Activity(19560): Handler got message123
01-26 06:25:40.683: I/MyThread(19560): Handler got message321

我在阅读 endian here 提供的帖子时发现了这一点。

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

【讨论】:

  • 这里的主要问题是我无法以纯异步方式将消息发送到活动。这样,如果 thread\Activity 忙,msgs 可能会丢失。 建议
【解决方案2】:

Here 是一篇很好的文章,解释了使用处理程序的线程和通信。此外,同一个博客有许多关于 Android 中各种线程构造的文章。

另一种可能性是使用 AsyncTasks。找个解释here

【讨论】:

  • 看起来不错。 ill take a look but im 很确定它涵盖了我需要的一切。 10倍! :)
  • 嗯,确实有帮助,但我m starting to question my hole design. ill 会发布另一个关于它的问题。
  • 我还是很困惑。我找不到在服务和线程之间传递数据异步的方法。
  • 按照第一个教程使用处理程序类
  • 我做到了。我仍然不明白线程如何将他的答案发送回主要活动。它只显示了如何从主要活动发送消息:mHandler.sendMessage(msg);
猜你喜欢
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2017-06-25
相关资源
最近更新 更多