3

即使网络连接不佳?

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

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

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

谢谢!

4

3 回答 3

1

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

于 2009-02-12T23:06:02.440 回答
1

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

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

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

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

还有一个对我有用的设计是同步 UI 和网络线程,这样它们就不会相互锁定(请用大量盐来接受这个建议,因为我在一些三星和三洋手机上遇到了很多有趣的错误,因为这个的)

总而言之,对你没有好的答案,但不同的策略。

于 2009-02-14T23:50:20.430 回答
0

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

于 2009-03-09T19:09:29.653 回答