【问题标题】:Android 2.2 readUTF() Socket ProblemAndroid 2.2 readUTF() 套接字问题
【发布时间】:2011-03-23 09:48:39
【问题描述】:

我正在尝试创建一个 Java 客户端-服务器程序,其中服务器在 Windows PC 上运行,而客户端在 Android 2.2 手机上运行。

连接正常。将数据从手机发送到 PC 也可以正常工作。 仅在电话上接收数据会使程序崩溃。

我正在使用 DataInputStream 和 DataOutputStream 通过 Socket 进行读/写。

    //Thread on the Phone
    public void run() {
    while (RUN) {

        if (socket != null && socket.isConnected()) {
            try {
                //Crash
                String text = dis.readUTF();
                myTextView.setText(text);

            } catch (IOException ex) {
                //ErrorHandling
            }

        }

    }
}

我想从服务器接收一个字符串,然后在 TextView 中显示它。 有任何想法吗?我已经设置了这个权限:

<uses-permission android:name="android.permission.INTERNET" />

我需要任何其他权限吗?谢谢。

【问题讨论】:

    标签: java android sockets


    【解决方案1】:

    如果您不在 UI 线程中,则无法在 UI 上设置文本。

    这样做...

    添加:

    Runnable showmessage = new Runnable() { public void run() { myTextView.setText(membervariabletext); } };

    从您的线程中,在 readUTF() 之后,调用“runOnUiThread(showmessage);”

    【讨论】:

    • 非常感谢。我为此苦苦挣扎了一段时间。这是首选的方法吗?为什么不能从另一个线程更改 UI?我是 Android 编程新手,所以也许你有一些关于这个特殊主题的信息?
    • 是的,这是要记住的规则。 (这在使用 C# 和 Visual Basic 进行 Windows 编程中的规则相同。)Google 给出了一个使用处理程序的示例:developer.android.com/resources/faq/commontasks.html#threading
    【解决方案2】:

    我会确保您的数据输入流正确启动:

    Socket s = new Socket(serverAddress, port); DataInputStream dis = new DataInputStream(s.getInputStream());

    否则,这里有一个示例代码链接,其中有人使用 InputStreamReader() 和 OutputStreamWriter() 为 Android 创建服务器和客户端。

    https://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

    【讨论】:

    • 谢谢。数据输入流已正确启动。我还尝试使用 StreamReader -> 相同的错误。仅当我从 PC 向手机发送内容时才会出现错误。也许它与字符串编码有关?非常感谢任何帮助。
    • 我还发现了一个使用 readUTF 和 writeUTF 的例子:android-er.blogspot.com/2011/01/simple-communication-using.html
    • 数据输入流使用修改后的 UTF-8,所以我想确保您的 PC 服务器正在发送该格式:developer.android.com/reference/java/io/DataInput.html
    • 我现在尝试只发送一个整数,它工作正常,至少接收部分。当我尝试设置 TextView 时似乎发生了错误:int s = dis.read(); song.setText(Integer.toString(s));
    • 嗯,我快疯了。看来我不能在我的线程运行循环中使用:TextView.setText("abcd")。我从我的 Activity 类中获取 Textview 对象作为参数并将其存储在 Membervariable 中。我还在循环中包含了一个 Thread.sleep() 无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2017-04-15
    相关资源
    最近更新 更多