@Jusit 建议我使用全局对象将数据从后台线程传递到活动并且它有效。但现在我担心死锁,以及是否有避免/防止它的好方法。此外,我不确定我选择 String 作为全局对象是否如此好。这是我目前所做的解释。
实际上,全局对象只是在 Blueterm.java 中创建的一个公共静态变量,如下所示:
public class BlueTerm extends Activity {
// a global object I guess
public static String strData = "";
// a couple of booleans to control reads/writes
public static boolean strWrite = false;
public static boolean strRead = false;
...
}
所以 strData 我想我的全局对象是由后台线程创建和写入的,如下所示:
while (BlueSentry.strRead == true);
BlueSentry.strWrite = true;
BlueSentry.strData = BlueSentry.strData + Character.toString(printableB);
BlueSentry.strWrite = false;
我的目的是让 strRead 在我的绘图活动正在读取它时防止 strData 被覆盖。strWrite 阻止我的绘图活动在写入 strData 时读取它,如下所示:
while (BlueSentry.strWrite == true);
BlueSentry.strRead = true;
String strData = BlueSentry.strData;
BlueSentry.strData = "";
BlueSentry.strRead = false
您可以看到 strData 在绘图活动通过读取后被重置为空字符串。
当我的手机没有连接到 USB 调试时,我经历了强制关闭,所以我不确定是什么导致了强制关闭。从那以后就没有发生过。
有什么建议可以在没有死锁的情况下实现并发吗?我已经阅读了有关互斥(信号量、锁、互斥锁)的信息,但我不确定应该使用哪个。另外,也许我选择 String 作为全局对象是一个不好的选择,因为我想要实时数据传输。那就是我不希望线程阻塞等待活动完成阅读。而且我不希望等待后台线程完成写入的活动被阻塞。我可以摆脱 String 并实现/使用 FIFO 缓冲区,不是吗?