【问题标题】:Android App crashes on while()Android 应用程序在 while() 上崩溃
【发布时间】:2016-03-26 10:24:41
【问题描述】:

在我的 android 应用程序中,我正在创建一个 Socket 和一个 BufferedReader。如果我只读取 BufferedReader 的一行,我会收到来自服务器的响应。但是如果我用while((message = br.readLine()) != null) 尝试它,应用程序就会崩溃。任何想法可能是什么问题?

代码

public void connecting(String uid) {
    uuid = uid;
    try {
        client = new Socket("127.0.0.1", 8234);
        try {
            tv = (TextView) chat.findViewById(R.id.textView);
            pw = new PrintWriter(client.getOutputStream());
            br = new BufferedReader(new InputStreamReader(client.getInputStream()));
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // If i just try this, it works
                        tv.append("\n"+br.readLine());

                        // If I'm trying this, it crashes
                        String message = "";
                        while((message = br.readLine()) != null) {
                            tv.append("\n"+message);
                        }
                    } catch (IOException e) {
                        tv.append(e.getMessage());
                    }
                }
            }).start();
            tv.append("Connected!");
            pw.println(uuid+":B31TR1TT");
            pw.flush();
        } catch (IOException e) {
            tv.append(e.getMessage());
        }
    } catch (IOException e) {
        tv.append(e.getMessage());
    }
}

【问题讨论】:

  • 你能贴出你的代码吗
  • 发布错误信息或logcat
  • 解决 StrictMode 所抱怨的问题而不是禁用 StrictMode 似乎是一个更好的主意。
  • 你在主线程上调用connecting吗?如果是这样,您可能应该确保您不这样做。 de.Timpa.mCyber.Check.connect 是什么?它列在您的堆栈跟踪中,但我在您的问题中没有看到它的代码。
  • 你应该把你的网络操作放在一个单独的线程中,而不是在 ui 线程中。也许这就是您收到错误的原因。

标签: java android sockets bufferedreader


【解决方案1】:

正如 algui91 所说,将网络调用移至单独的线程。严格模式错误(violation=4)表示 ui 线程上的网络调用。

只需将网络调用重构为后台任务(服务、异步任务或 whaetever),问题就会消失。

将 UI 与业务逻辑或网络通信分开。它总是更好,更容易测试/调试。

【讨论】:

    【解决方案2】:

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024); byte[] buffer = new byte[1024]; int bytesRead; InputStream inputStream = socket.getInputStream(); while ((bytesRead = inputStream.read(buffer)) != -1){ byteArrayOutputStream.write(buffer, 0, bytesRead); response += byteArrayOutputStream.toString("UTF-8"); }

    尝试使用此代码而不是 while 循环代码 或访问此链接http://hastebin.com/inecerakes.java

    【讨论】:

    • 这与违反 StrictMode 政策有什么关系?
    • 哦。抱歉,根据您的日志猫,您需要使用严格模式。
    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多