Java Android-Arduino蓝牙通信:应用程序停止读取输入流

Java Android-Arduino蓝牙通信:应用程序停止读取输入流,java,android,inputstream,android-bluetooth,Java,Android,Inputstream,Android Bluetooth,我试图在Arduino Uno上处理一个模拟压力传感器信号,并通过蓝牙向我的Android应用程序用户界面发送一个输出字符串 我已经在应用程序和HC-05模块之间建立了BT连接,并且能够通过向我的Arduino写入一个字符串来获取UI上的inputStream,并作为响应接收一个字符串 我试图在收到来自Arduino的信号后触发一个对话框警报,按钮b1被配置为setOnclickListner以写入Arduino,作为响应,Arduino发送inputStream 问题是,一旦活动打开,应用程序

我试图在Arduino Uno上处理一个模拟压力传感器信号,并通过蓝牙向我的Android应用程序用户界面发送一个输出字符串

我已经在应用程序和HC-05模块之间建立了BT连接,并且能够通过向我的Arduino写入一个字符串来获取UI上的inputStream,并作为响应接收一个字符串

我试图在收到来自Arduino的信号后触发一个对话框警报,按钮b1被配置为setOnclickListner以写入Arduino,作为响应,Arduino发送inputStream

问题是,一旦活动打开,应用程序就会读取输入流一次,但之后就停止接收,这对我来说是个问题,因为我的UI设计假设发送一个基于传感器实时传入数据的信号,而不是setOnClickListener何时触发

我试图找到一种不用点击按钮就可以写入Arduino的方法,然后一旦应用程序读取输入流,我就需要它继续监听传入的数据并每次调用对话框函数,有什么建议我可以从哪里开始吗

公共类蓝牙\u活动扩展了AppCompative活动{
//小部件
按钮b1;按钮b2;按钮b3;
文本视图t1;文本视图t2;
//蓝牙:
字符串地址=null,名称=null;
蓝牙适配器myBluetooth=null;
蓝牙服务器插座;
BluetoothSocket btSocket=null;
设置配对设备;
静态最终UUID myUUID=UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”);
处理蓝牙素;
蓝牙设备处理器;
私有StringBuilder recDataString=新StringBuilder();
InputStream tmpIn=null;
OutputStream tmpOut=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u蓝牙);
b1=(按钮)findViewById(R.id.button1);
b3=(按钮)findViewById(R.id.str_对话框);
试一试{
蓝牙连接设备();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有void警报系统()引发IOException{
AlertDialog.Builder mBuilder=新建AlertDialog.Builder(Bluetooth_Activity.this);
View mView=GetLayoutFlater()。充气(R.layout.alert_对话框,空);
按钮mClose=(按钮)mView.findviewbyd(R.id.btn\u关闭);
mBuilder.setView(mView);
final AlertDialog dialog=mBuilder.create();
dialog.show();
mClose.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
dialog.dismise();
}
});
}
//蓝牙功能:
私有类someThread扩展线程{
公开募捐{
abc();
}
}
私有无效蓝牙连接设备()引发IOException{
试一试{
myBluetooth=BluetoothAdapter.getDefaultAdapter();
address=myBluetooth.getAddress();
pairedDevices=myBluetooth.getBondedDevices();
如果(pairedDevices.size()>0){
用于(蓝牙设备bt:pairedDevices){
address=bt.getAddress().toString();
name=bt.getName().toString();
Toast.makeText(getApplicationContext(),“Connected”,Toast.LENGTH\u SHORT.show();
}
}
}捕获(例外我们){
}
myBluetooth=BluetoothAdapter.getDefaultAdapter();//获取移动蓝牙设备
BluetoothDevice dispositivo=myBluetooth.getRemoteDevice(地址);//连接到设备的地址并检查其是否可用
btSocket=dispositivo.createInsurerFComSocketToServiceRecord(myUUID);//创建RFCOMM(SPP)连接
btSocket.connect();
尝试
{
Toast.makeText(getApplicationContext(),(“BT名称:“+Name+”\nBT地址:“+Address”),Toast.LENGTH\u SHORT.show();
}捕获(例外e){}
}
公共图书馆{
试一试{
byte[]buffer=新字节[256];//流的缓冲区存储
int bytes;//从read()返回的字节
tmpIn=btSocket.getInputStream();
DataInputStream mmInStream=新的DataInputStream(tmpIn);
字节=mmInStream.read(缓冲区);
String readMessage=新字符串(缓冲区,0,字节);
Toast.makeText(getApplicationContext(),
“从蓝牙接收的输出:\n”+读取消息,
吐司。长度(短)。show();
警报系统();
}捕获(例外e){
}
}
@凌驾
公共void onClick(视图v){
如果(v.getId()==R.id.button1)
{
尝试
{
String i=“f”//我在这里发送一个字符f,当arduino收到它时,它将
//发送响应
btSocket.getOutputStream().write(i.getBytes());
睡眠(1500);
abc();
}捕获(例外e){}
}   
}

很清楚为什么会发生这种情况,因为您是这样编码的!您将执行蓝牙io的代码放在onclick侦听器中,因此只有在单击该按钮时才会运行

如果你想调节android应用程序在收到某个蓝牙信号后执行一段代码,你需要在另一个(不仅仅是在点击按钮时)中无限期地监听该信号(并且不要阻止ui),然后调用a,如果你想更新ui;因此你的代码应该如下所示:

new Thread(new Runnable() {
        @Override
        public void run() {
            while (true){//an infinite loop
                //read signals
                //process them
                //call some handler to deal with the ui
            }
        }
    })