我正在为BB开发一个项目。该应用程序与网络一起工作,并通过HTTP发送/接收数据。现在我使用队列和队列管理器。管理器从后台线程开始,在while (true)循环中工作,检查队列中是否有新的事务发送到服务器。如果队列不为空,则执行事务,否则管理器将休眠200毫秒。
事务的处理过程如下:-运行另一个线程(使用Runnable),它打开一个到网络的连接,第一个线程等待我们设置的后台线程或超时(为此,我们需要一个循环)。-如果建立了连接,然后启动另一个线程(使用Runnable),它运行getResponseCode (),并启动第一个线程,等待我们设置的后台线程或超时(为此,我们需要一个循环)。
在它之前,我们显示了带有等待旋转图像的弹出窗口,在它被移除之后。它通过Application.getEventLock ()进行同步。
Iit有时不稳定,线程长时间休眠忽略超时等待循环。
我想知道这种方法有多有效,有什么建议和最佳实践,你的经验是什么?
我使用4.5、4.6、4.7和5.0。
发布于 2010-03-06 01:07:23
Application.getEventLock()返回的锁应该只用于修改UI或UI组件的代码-它是事件分派器使用的锁。您不应该将其用于后台任务,例如HTTP处理。如果您想同步这些代码,最好只创建您自己锁对象。
发布于 2013-09-16 13:31:03
您不需要那么多线程,您的EDT (事件分派线程,也称为主线程)应该将作业(某个可运行的类)插入到队列中,并使用等待/通知来通知负责网络事务的专用工作线程检查队列。工作线程将负责打开连接、写入连接和从连接读取。
有关等待/通知机制的信息,请查看:A simple scenario using wait() and notify() in java
由于您不能使用工作线程更新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
https://stackoverflow.com/questions/2385995
复制相似问题