是否可以在j2me中将数据作为后台进程上传?

时间:2009-02-12 22:08:50

标签: java-me network-programming midp cldc

即使网络连接不良?

具体来说,我编写的代码启动了一个单独的线程(来自UI),尝试通过HTTP POST上传文件。但是,我发现,如果连接错误,处理器会卡在outputstream.close()或httpconnection.getheaderfield()或任何强制通过网络传输数据的读/写上。这不仅会导致线程卡住,而且会窃取整个处理器,因此即使用户界面也没有响应。

我尝试降低线程的优先级,但无济于事。

我的理论是没有简单的方法来避免这种行为,这就是为什么所有的j2me教程都指示开发人员创建“通过网络发送数据......”屏幕,而不是仅仅在后台线程中发送所有内容。如果有人能证明我错了,那就太棒了。

谢谢!

3 个答案:

答案 0 :(得分:1)

这在很大程度上取决于您编写代码的方式以及运行代码的位置。在CLDC上,线程的概念非常有限,如果任何线程正在进行一些持久的操作,其他线程也可能(并且通常也被)阻塞。在设计应用程序时,您应该考虑到这一点。

答案 1 :(得分:1)

一个重要方面是您需要具有通用UI或屏幕,当后台网络调用失败时可以显示。它几乎是任何移动应用程序,J2ME或其他必须的。

正如Honza所说,这取决于设计,有很多事情可以做,比如在app启动时预先获取数据,或者根据加载的屏幕预取数据(即导航路径),或者在应用程序等中内置了默认数据集。

您可以尝试的另一件事是内置计时器机制,在一定时间后重试数据下载,并在说5次尝试或1-2分钟后中止并显示通用屏幕或错误消息。

J2ME中的某些手机允许检测飞行模式,如果可能,您可以检测到并立即显示适当的屏幕。

另外一个对我有用的设计是同步UI和网络线程,这样他们就不会互相锁定了(因为我在一些三星上有很多有趣的错误,所以请大量使用这些建议)三洋手机因为这个)

总的来说,对你来说没有好的答案,但不同的策略。

答案 2 :(得分:0)

您可以将文件数据划分为块,然后在失败时上载多次重试。这取决于您的应用策略。如果您的优先级是上传批量数据而没有失败。您需要在服务器上组装块以构建数据。这可能会产生连接的开销,但是您的数据上传的可能性很高。如果您不是同时上传文件,这将很容易。