【问题标题】:ANDROID HELP! error:android.os.NetworkOnMainThreadException [duplicate]安卓帮助!错误:android.os.NetworkOnMainThreadException [重复]
【发布时间】:2013-11-10 15:47:12
【问题描述】:

我正在使用一个示例来学习 android 中套接字的使用。我对此有点陌生,我正在用一本书来学习。 我无法真正弄清楚问题出在哪里,因为该示例实际上是从书中复制的,除了 IP,它是我的计算机。 android 应用程序不断抛出此错误:

错误:android.os.NetworkOnMainThreadException

我贴出代码:

因为有些词是西班牙语,我会为你翻译,以防万一它更容易理解:

PUERTO-->端口,ENTRADA--​​>输入,SALIDA-->输出,ENVIANDO-->发送,HOLA MUNDO-->hello world,RECIBIENDO-->接收,DATOS-->数据,CLIENTE-- >客户

安卓客户端

    package com.jacho981.clienteecho;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class ClienteECHO extends Activity {

    private TextView output;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cliente_echo);

        output = (TextView) findViewById(R.id.TextView01);
        ejecutaCliente();
    }

    private void ejecutaCliente() {
        // String ip = "158.42.146.127";
        String ip = "192.168.1.3";
        int puerto = 7;

        log(" socket " + ip + " " + puerto);

        try {
            Socket sk = new Socket(ip, puerto);
            BufferedReader entrada = new BufferedReader(new InputStreamReader(
                    sk.getInputStream()));
            PrintWriter salida = new PrintWriter(new OutputStreamWriter(
                    sk.getOutputStream()), true);

            log("enviando...");

            salida.println("Hola Mundo");

            log("recibiendo..." + entrada.readLine());

            sk.close();
        } catch (Exception e) {
            log("error: " + e.toString());
        }

    }

    private void log(String string) {
        output.append(string + "\n");
    }

}

JAVA 服务器

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServidorECHO {

    public static void main(String args[]) {
        try {
            ServerSocket sk = new ServerSocket(7);
            while (true) {
                Socket cliente = sk.accept();
                BufferedReader entrada = new BufferedReader(
                        new InputStreamReader(cliente.getInputStream()));
                PrintWriter salida = new PrintWriter(new OutputStreamWriter(
                        cliente.getOutputStream()), true);
                String datos = entrada.readLine();
                salida.println(datos);
                cliente.close();
            }
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

【问题讨论】:

  • 在你用感叹号提问之前,我希望你退后一步,看看你得到的错误,“主线程上的网络异常”。谷歌搜索此错误将显示多个结果,帮助您修复它。您需要将您的网络代码移出主线程。
  • 标题中带有networkonmainthreadexception的任何问题的重复。

标签: java android sockets client


【解决方案1】:

这是人们在 Android Jellybean 中遇到的异常并说,“相同的代码在较低版本中有效,但在 jellybean 中无效”。

解决方案是,您必须将网络操作从主线程转移到 bachground 线程。
AsyncTask 是一个很好的解决方案。 这是Android Background processing上的一个不错的教程

【讨论】:

    【解决方案2】:
    android.os.NetworkOnMainThreadException
    

    你在main gui上做一些时间操作,可能会卡住用户,甚至挂掉ui,你需要一个AsyncTask来在主线程中执行网络操作,

    有关 AsyncTasks 的更多信息

    http://developer.android.com/reference/android/os/AsyncTask.html

    在 Android Honeycomb 及更高版本上,应用程序会因NetworkOnMainThreadException 而崩溃,但可以在早期版本上运行。

    来自开发者参考

    这仅针对以 Honeycomb SDK 为目标的应用程序或 更高。允许针对早期 SDK 版本的应用程序执行 在他们的主事件循环线程上联网,但它很重 气馁。

    http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多