3

我正在为 BB 开发一个项目。该应用程序与网络一起工作并通过 HTTP 发送/接收数据。现在我使用队列和队列管理器。管理器从一个后台线程开始,并在 while (true) 循环中工作,检查队列中是否有到服务器的新事务。如果队列不为空,则执行事务,否则管理器休眠 200 毫秒。

事务的过程如下: - 运行另一个线程(使用 Runnable),它打开与网络的连接,第一个线程等待后台线程或超时(为此我们需要一个循环),这是我们设置的。- 如果连接建立,则启动另一个线程(使用 Runnable),它运行 getResponseCode(),第一个线程等待后台线程或超时(为此我们需要一个循环),这是我们设置的。

在它之前,我们显示带有等待旋转图像的弹出窗口,在它被移除之后。它通过 Application.getEventLock() 同步。

它有时不稳定并且线程长时间休眠忽略超时等待循环。

我想知道这种方法的有效性,什么建议和最佳实践,你的经验是什么?

我使用 4.5、4.6、4.7 和 5.0。

4

2 回答 2

2

返回的锁Application.getEventLock()应该只用于修改 UI 或 UI 组件的代码 - 它是事件调度程序使用的锁。您不应该将它用于 HTTP 处理等后台任务。如果您想同步该代码,最好只创建您自己的锁对象。

于 2010-03-05T17:07:22.690 回答
1

您不需要那么多线程,您的 EDT(事件调度线程又名主线程)应该将他的作业(一些可运行的类)插入队列并使用等待/通知来通知负责网络事务的专用工作线程,以检查队列。工作线程将负责打开连接、写入连接并从中读取。

有关等待/通知机制的信息,请查看: Java 中使用 wait() 和 notify() 的简单场景

由于您无法使用工作线程更新 UI,一旦网络事务完成,您可以使用 InvokeLater 更新 UI 层

有关更多详细信息,请访问http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/system/Application.html#invokeLater(java.lang.Runnable)

您可以在 HTTPConnection 本身中设置超时,但如果您不想依赖该机制,您可以安排一个 TimerTask,该任务将在一段时间后执行,并在未收到响应的情况下处理超时。一旦收到响应,您需要做的就是取消 TimerTask 以便不会触发超时。

查看http://www.blackberry.com/developers/docs/4.0api/java/util/TimerTask.html

于 2013-09-16T05:31:02.783 回答