gpt4 book ai didi

java - Android:线程以未捕获的异常退出

转载 作者:行者123 更新时间:2023-11-29 09:03:44 25 4
gpt4 key购买 nike

我遇到了问题,但找不到解决方案。当我通过蓝牙连接接收数据时,我的程序突然崩溃了。我在单独的线程中接收数据,每个接收到的字节都保存在队列中。 我还有一个 TimerTask,它每 1 毫秒调用一次从队列中读取数据的方法,并在 UI 中刷新 TextBox。我的程序运行了一段时间,然后突然崩溃了。请帮忙。以下是主要代码 fragment 。

public class MainActivity extends Activity
{
TextView myLabel1;
volatile boolean stopWorker = false;


public Queue<Byte> receiverQueue = new LinkedList<Byte>();
protected byte[] receiverArray;
private boolean newDataRead = false;

//timer
TimerTask mTimerTask;
Timer timer = new Timer();
final Handler timerHandler = new Handler();
}

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

myLabel1 = (TextView)findViewById(R.id.textView1);
//start with timer ticking after 1 sec, and give timer tick every 1ms

onTimerTick();
timer.schedule(mTimerTask, 1000, 1);
}


//method for reading data from receiverQueue
protected void readDataFromReceiverBuffer() {
//if receiverQueue is not empty, read data
if(receiverQueue.isEmpty() == false) {
//declaration of byte array receiverField size of receiverQueue
receiverArray = new byte[receiverQueue.size()];
//read bytes from queue until is empty
for (int i = 0; receiverQueue.isEmpty() == false; i++) {
//retrieves and removes the head of this queue, or returns null
receiverArray[i] = receiverQueue.poll();
}
//variable newData is set to true, when we read new data from queue
newDataRead = true;
}
}


Thread dataReceiveThread = new Thread(new Runnable() {
//received byte
int receivedData;
public void run() {
while(!Thread.currentThread().isInterrupted() && !stopWorker) {

try {
//read one byte from InputStream
receivedData = mmInStream.read();
//inserts received byte into this queue if it is possible
if(receivedData != -1)
receiverQueue.offer((byte)receivedData);
}
catch (IOException ex) {
stopWorker = true;
}
//Log.i(String.valueOf(receivedData), "valueOfReceivedData");
}
}
});

public void onTimerTick() {
mTimerTask = new TimerTask() {
String temp;
//this method is called
public void run() {
//call method for read data from queue
readDataFromReceiverBuffer();
timerHandler.post(new Runnable() {
public void run() {
//when new data has arrived, we update UI
if(newDataRead == true) {
//convert byte array to string
temp = new String(receiverArray, 0, receiverArray.length);
myLabel1.setText(temp);
newDataRead = false;
}
}
});
}};
}

日志:

W/dalvikvm(12358): threadid=11: thread exiting with uncaught exception (group=0x40ab1210)
E/AndroidRuntime(12358): FATAL EXCEPTION: Timer-0
E/AndroidRuntime(12358): java.lang.ArrayIndexOutOfBoundsException: length=21; index=21
E/AndroidRuntime(12358): at com.example.colibri2bb.MainActivity.readDataFromReceiverBuffer(MainActivity.java:195)
E/AndroidRuntime(12358): at com.example.colibri2bb.MainActivity.readDataFromReceiverBuffer(MainActivity.java:195)
E/AndroidRuntime(12358): at com.example.colibri2bb.MainActivity$3.run(MainActivity.java:230)
E/AndroidRuntime(12358): at java.util.Timer$TimerImpl.run(Timer.java:284)

日志:

W/dalvikvm(17344): threadid=12: thread exiting with uncaught exception (group=0x40ab1210)
E/AndroidRuntime(17344): FATAL EXCEPTION: Timer-1
E/AndroidRuntime(17344): java.util.NoSuchElementException
E/AndroidRuntime(17344): atjava.util.LinkedList.removeFirstImpl(LinkedList.java:689)
E/AndroidRuntime(17344): at java.util.LinkedList.removeFirst(LinkedList.java:676)
E/AndroidRuntime(17344): at java.util.LinkedList.poll(LinkedList.java:895)
E/AndroidRuntime(17344):atcom.example.colibri2bb.MainActivity.readDataFromReceiverBuffer(MainActivity.java:196)
E/AndroidRuntime(17344): atcom.example.colibri2bb.MainActivity$3.run(MainActivity.java:231)
E/AndroidRuntime(17344): at java.util.Timer$TimerImpl.run(Timer.java:284)

最佳答案

在您从中读取数据时,其他线程是否可以修改 receiverQueue 并添加数据?尝试改用这个 for 循环。它应该确保您不会越界。

int queueSize = receiverQueue.size();
receiverArray = new byte[queueSize ];
for (int i = 0; i<queueSize; i++) {
...
}

关于java - Android:线程以未捕获的异常退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16076657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com