Java 如何使用runOnUiThread获取每次从服务到活动的消息
我遇到了一个问题。我需要一些人检查我的代码的一部分,帮助我解决问题,批评我的代码(我写代码,但我没有人可以说这是错误的或这种模式的东西) 一般来说 我的服务从蓝牙(HC-05)获取消息,我可以在服务中的Log.d中看到值 获取消息的我的服务的部分代码Java 如何使用runOnUiThread获取每次从服务到活动的消息,java,android,android-studio,arduino,bluetooth,Java,Android,Android Studio,Arduino,Bluetooth,我遇到了一个问题。我需要一些人检查我的代码的一部分,帮助我解决问题,批评我的代码(我写代码,但我没有人可以说这是错误的或这种模式的东西) 一般来说 我的服务从蓝牙(HC-05)获取消息,我可以在服务中的Log.d中看到值 获取消息的我的服务的部分代码 private class ConnectedThread extends Thread{ private final BluetoothSocket bluetoothSocket; private final I
private class ConnectedThread extends Thread{
private final BluetoothSocket bluetoothSocket;
private final InputStream inputStream;
private final OutputStream outputStream;
public ConnectedThread(BluetoothSocket socket){
Log.d(TAG,"ConnectedThread: Starting");
bluetoothSocket=socket;
InputStream tmpInput = null;
OutputStream tmpOutput = null;
try{
tmpInput = bluetoothSocket.getInputStream();
tmpOutput = bluetoothSocket.getOutputStream();
}catch (IOException e){
e.printStackTrace();
active=false;
}
inputStream=tmpInput;
outputStream=tmpOutput;
}
@Override
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while(active){
try {
bytes = inputStream.read(buffer);
final String comingMsg = new String(buffer,0,bytes);
Log.d(TAG,"InputStream: " + comingMsg);
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.obj = comingMsg;
message.what = 1; // I need it to prevent NullObjReference
Log.d(TAG,"Handler run(): " + message.obj);
mHandler.sendMessage(message);
}
});
}catch (IOException e){
Log.e(TAG,"Write: Error reading input." + e.getMessage());
active=false;
break;
}
}
}
...some code is hidden because it is diploma thesis
}
问题是每次从该服务获取消息到另一个活动时都会发生。
我尝试了很多东西(使用线程、循环器、runOnUiThread、handleMessage和回调),在stackoverflow中检查了很多帖子,并尝试与我的项目结合,但一直以来我都有nullobjectreference(为此我尝试使用msg.what-to-check),尝试移动到我的主活动时出现了黑屏(它是main)并更新我的textView或典型崩溃应用程序
现在我只想从服务获取消息到文本视图。当一切都开始正常工作时,我想解析字符串(例如3个第一个字符)并将消息发送到六个TextView中的一个
启动方法runThread()之前onCreate中的部分代码:
Log.d(TAG,"Check intent - result");
if(getIntent().getIntExtra("result",0)==RESULT_OK){
mDevice = getIntent().getExtras().getParcelable("bonded device");
startConnection(mDevice,MY_UUID);
Log.d(TAG,"Check is active service ");
checkIfActive();;
}
Log.d(TAG,"Check intent - connect_to_paired");
if(getIntent().getIntExtra("connect_to_paired",0)==RESULT_OK){
mDevice = getIntent().getExtras().getParcelable("bonded_paired_device");
startConnection(mDevice,MY_UUID);
Log.d(TAG,"Check is active service ");
checkIfActive();
}
public void checkIfActive(){
Log.d(TAG,"CheckIfActive: Started");
while(myBluetoothService.active!=true) {
Log.d(TAG,"CheckIfActive() active is "+ myBluetoothService.active);
if (myBluetoothService.active) {
Log.d(TAG, "CheckIfActive: Running method runOnUiThread - myBluetoothService.active is "+myBluetoothService.active);
runThread();
}
}
}
方法runThread(),该方法在连接蓝牙设备后每次都应工作:
public void runThread(){
//I used there Thread but when connection was fail,
// method created multiply threads when I tried to connect next time
runOnUiThread(new Runnable() {
@Override
public void run() {
handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
while (true) {
switch (msg.what) {
//when is one, service has messages to send
case 1:
String message = myBluetoothService.mHandler.obtainMessage().toString();
rearLeft.setText(message);
break;
default:
super.handleMessage(msg);
}
}
}
};
}
});
}
更新:
这是个好主意吗?也许我可以将JSON对象放到服务中以发送消息,在HomeActivity中,我可以尝试从JSON获取值。它快吗?我发送了很多数据,因为蓝牙每次都会在几毫秒内从4个超声波传感器接收4次距离数据
下面是当我有调试日志时如何在服务中查看数据的屏幕
下一个想法,但仍然没有:
家庭活动(我的主要活动)
应该将数据从蓝牙发送到UI线程的服务是相同的(检查第一个代码)
HomeActivity的屏幕,您可以在其中看到6个文本视图。现在,我想把所有的文本放在一个视图中,它将在获取下一条消息时刷新
好的,这篇文章有助于我解决问题: 也许这个链接可以帮助其他人。
感谢您的帮助,现在了解为什么我应该使用广播接收器来执行此操作。您应该使用广播接收器让活动接收来自服务的消息。@blackapps为您提供了一些示例。目前我使用4个广播接收器来接收其他东西,但我在脑海中看不到这个想法。如何使用“BroadcastReceiver getMsgReceiver=new BroadcastReceiver(){on Receive(…){}”获取此消息。我一直需要一些方法来获取它(消息)。(我知道广播中的动作)。@Bartusiak那么你现在有什么问题?您无法从活动中接收数据?您可以从活动中接收数据,但该数据为空?或者你可以从你的活动中接收数据,但当在TextView上显示时,它会使应用程序崩溃?@NhãtèGiang我在活动中无法接收数据。我像测试和错误方法一样工作。有一次,我有空。第二次我试着做些什么都没有,但服务起了作用。第三次应用程序崩溃-一个原因是空对象引用,第二个原因是在另一个原因工作时无法使用loper。@Nhấ例如:当我更改方法runThread()中的代码并将其放在:,我就与HC-05相连。服务正在运行(我在Log.D中看到消息),但当手机试图显示HomeActivity布局时,手机上出现了黑屏。我知道虽然-可能是黑屏的问题,但每次都需要想法来解决我的问题。每次都能收到信息。
public void runThread(){
runOnUiThread(new Runnable() {
@Override
public void run() {
//Looper.prepare();
new Handler() {
@Override
public void handleMessage(Message msg) {
rearLeft.setText(msg.obj.toString());
}
};
//Looper.loop();
//Log.d(TAG, myBluetoothService.mHandler.getLooper().toString());
//rearLeft.setText(myBluetoothService.mHandler.getLooper().toString());
}
});
}