当前位置: 首页 > 知识库问答 >
问题:

如何在Android/Java中从两个不同的线程中写/读字符串数据

双浩涆
2023-03-14

我有一个Android应用程序从线程a中的BLE设备接收ASCII字符串(因此字符串中的每个字符正好对应一个字节)。

这些字符串以最大长度的块形式出现。例如,假设最大长度为4,我们收到以下字符串

“ABCD”(4)、“EFGH”(4)、“I\R\N”(3)

我很确定我在这里重新发明轮子,但我在网上找不到一个明确的答案。在Java/Android中一定有更好的方法来做到这一点。听起来像是很常见的模式

我主要是用C#来做事情的,所以我可能会缺少一些类。我还查看了ByteBuffer,但似乎这样做会迫使我实现自己的readLine()函数,因为没有可供BufferedReader使用的InputStream等。

共有1个答案

钱黎明
2023-03-14

您可以使用GreenRobot的EventBus轻松地在线程之间发送数据

GreenRobot的EventBus是一个允许组件(活动、片段、服务和背景线程)之间通信的库。

Build.Gradle

dependencies {      
    compile 'org.greenrobot:eventbus:3.0.0'     
}
public class BleListener{
    private static Context _context;
    private static BleListener _instance;
    private static ListenerThread _listenerThread;
    private static boolean _isListenerThreadEnable = false;

    private BleListener(Context context){
        _context = context;

        // set ble config and open ble port in here
        // ....

        // enable listener thread
        if (!_isListenerThreadEnable) {
             _listenerThread = new ListenerThread();
             _listenerThread.start();
             _isListenerThreadEnable = true;
        }

    }

    // call this function from outer class
    public static BleListener getInstance(Context context) {
        if (_instance == null) {
            _instance = new BleListener(Context context);
        }
        return _instance;
    }

    private class ListenerThread extends Thread {

        ListenerThread() {
            // setting your receive buffer, thread priority in here
        }

        @Override
        public void run() {

            while (_isListenerThreadEnable) {
                synchronized (_bleDevice) {

                    int _receivedCount = _bleDevice.getQueueStatus();

                    while (_receivedCount > 0) {
                        // append your received data in here with ByteBuffer or StringBuffer
                        // ..

                        // parsing data for get valid data
                        // ..

                        // send valid data out when receive special character (end of message flag) or when timeout received with EventBus
                        EventBus.getDefault().post( ValidModal);                    
                    }
                }
                Thread.Yield();
           }
       }
    }
}
@Override
public void onStart() {
    super.onStart();


    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);

    super.onStop();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(ValidModal) {
    // You will get valid data from thread A here.
    //..
}
 类似资料:
  • 问题内容: 我想通过获取从EditText输入的文本来将文件保存到内部存储中。然后,我希望同一个文件以字符串形式返回输入的文本,并将其保存到另一个字符串中,以备后用。 这是代码: 我提供了一些评论,以帮助你进一步分析我要在哪里完成操作/使用变量的观点。 问题答案: 希望这对你有用。 写文件: 读取文件:

  • 我刚来Java,如果这是个明显的问题,我很抱歉。 我正在尝试逐个字符读取字符串以创建树节点。例如,输入,节点为 我注意到了 我可以用一个循环来获得所有的角色吗?就像 我试过了,但不管用。 我该怎么做? 非常感谢你的帮助。 扫描器读取器=新扫描器(System.in);System.out.println(“将节点输入为大写字母,不带空格,结尾为'/'”);int i=0;char node=rea

  • 问题内容: 我正在尝试连接Java中的字符串。为什么这不起作用? 问题答案: 你可以使用运算符来连接字符串: 被隐式转换为。

  • 问题内容: Java没有运算符重载的概念。 Still +运算符的行为与带数字的加法运算符和带字符串的串联运算符相同。这类似于操作员的重载行为。 那么,Java是否有运算符重载? 问题答案: Java语言会重载某些运算符吗? 是! 如您所知,运算符可以表示两种不同的含义,即字符串串联或数字加法。 根据定义 ,这是一个运算符重载。 以下是 所有 Java运算符的列表: [JLS 3.12运算符](h

  • 我有一个情况,我需要启动两个线程一个接一个。我尝试了以下代码片段,在这里我可以启动Thread12,但不能启动Thread2。我怎样才能开始两个......?如何启动两个线程一个接一个...? 代码片段

  • 问题内容: 我想使用一个 for 循环来计算一个字符串中的一个字符在另一个字符串中出现的次数。 例如,如果string1 =’python’和string2 =’boa constrictor’,则应计算为6(2 t,3 o,1 n) 有谁知道如何做到这一点? 问题答案: 很简单: