0

@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 缓冲区,不是吗?

4

1 回答 1

3

如果您要从后台线程转到 Activity,请使用 Handler(参见http://developer.android.com/reference/android/os/Handler.html )作为通信技术。有关快速教程,请参阅http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html ,但简而言之:

  1. 在您的活动中创建一个接受Character.toString(printableB)消息中的值的处理程序。
  2. 将 Handler 传递给后台线程。
  3. 后台线程在每次更新时向 Handler 发送消息。
  4. 处理程序被调用并在 Activity 的线程上进行必要的更改。

没有全局共享变量,没有潜在的读/写错误,每个人都回家快乐。

于 2011-05-29T14:39:53.167 回答