【问题标题】:Blackberry HTTPConnection best practices黑莓 HTTPConnection 最佳实践
【发布时间】:2010-03-05 10:26:43
【问题描述】:

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

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

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

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

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

我使用 4.5、4.6、4.7 和 5.0。

【问题讨论】:

    标签: blackberry java-me httpconnection


    【解决方案1】:

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

    【讨论】:

    • 我可以使用invokeLater和invokeAndWait来修改UI吗?
    • 是的,这通常是您在非 UI 线程中“包装”UI 调用的方式。
    【解决方案2】:

    您不需要那么多线程,您的 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

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 1970-01-01
      • 2011-09-04
      • 2011-01-24
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2013-02-20
      相关资源
      最近更新 更多