我正在尝试编写一个MIDP应用程序,该应用程序进行了大量的网络连接。这一切都是通过HttpURLConnection完成的(该平台支持的一切; Socket不起作用)。引起问题的主要部分是代码,它通过一组HTTP连接在一个InputStream和一个OutputStream之间建立隧道,以便每次读取和写入都变成一个单独的POST请求。

我发现,尽管在MIDP中进行联网还不错,但是在MIDP中停止域联网却是一场噩梦。我发现我最终遇到了很多线程,所有线程都被read()或write()阻塞,并且全部找到它们并杀死它们确实很困难。 Thread.interrupt()在Java的InputStream.read()和OutputStream.write()中不起作用没有帮助,并且在Stream上调用close()并非总是可能的,因为该流可能隐藏在内部URLConnection和URLConnection本身没有任何办法告诉它关闭连接。

我的平台对清理疯狂地挑剔并没有帮助。例如,如果我在应用程序退出时让线程保持运行状态,则系统会重新启动。我怀疑它在与主设备UI相同的VM中运行Midlet。

因此:有人能建议我采用一种合适的结构来简化这种事情吗?因为现在它变成了分形的线程,捕获块,中断和IOException的迷宫,而我很快就失去了对其工作方式的了解。

另外,一个很好的由事件驱动的,包装URLConnection的IO库将很方便。 is,这是MIDP,因此不能选择nio或channel或类似的东西。

编辑:更新:事实证明它毕竟不是MIDP,而是PBP 1.1。啊,文档不足的乐趣。尽管如此,它们并不太相似,并且供应商告诉我们,唯一起作用的网络系统是HttpURLConnection。

最佳答案

您不仅会在不同的电话上,而且在不同的配置和运营商,固件,网络和网络条件下,都会遇到不同的网络问题。

就是说,您可以自由地使用套接字来实现HTTP客户端-您的假设不是所有的,而是最古老的手机。您还应该看看Connection.close()方法。我目前正在使用以下关闭方法,该方法简单但有效:

public void close() {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            inputStream = null;
        }
    }
    if (outputStream != null) {
        try {
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            outputStream = null;
        }
    }
    if (connection != null) {
        try {
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            connection = null;
        }
    }
    closed = true;
}


如果这不起作用,那么您注定要失败。换句话说,您不应该假设您可以在所有MIDP电话上使MIDP完美地工作-因为您不能这样做。为更大的前景而设计,不要花时间调试毫无希望的有缺陷的MIDP实现。

您可能要同步。

关于java - MIDP中的复杂网络:如何关闭URLConnection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5532960/

10-12 05:08