代码之家  ›  专栏  ›  技术社区  ›  Vlad Tsepelev

黑莓httpconnection最佳实践

  •  3
  • Vlad Tsepelev  · 技术社区  · 16 年前

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

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

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

    IIT有时不稳定,线程长时间睡眠忽略超时等待循环。

    我想知道这样的方法有多有效,有什么建议和最佳做法,你有什么经验?

    我使用4.5、4.6、4.7和5.0。

    2 回复  |  直到 12 年前
        1
  •  2
  •   Marc Novakowski    16 年前

    锁是由 Application.getEventLock() 只应用于修改UI或UI组件的代码-它是事件分派器使用的锁。您不应该将它用于后台任务,如http处理。如果要同步该代码,最好创建自己的锁对象。

        2
  •  1
  •   Community Mohan Dere    9 年前

    您不需要那么多线程,您的edt(event dispatch thread a.k.a main thread)应该将作业(某些可运行类)插入队列,并使用wait/notify通知负责网络事务的专用工作线程来检查队列。 工作线程将负责打开连接、写入连接和读取连接。

    有关等待/通知机制的信息,请签出: 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

    推荐文章