【问题标题】:Why is my code running on the main thread?为什么我的代码在主线程上运行?
【发布时间】:2014-08-15 09:37:02
【问题描述】:

我在我的 onCreate 方法中使用了以下代码:

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

        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View arg0) {
                Thread thread = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        try {
                            ServerSocket serverSocket = new ServerSocket(9002);
                            Socket s = serverSocket.accept();

                            DataOutputStream outputStream = new DataOutputStream(
                                    s.getOutputStream());
                            BufferedReader inputStream = new BufferedReader(
                                    new InputStreamReader(s.getInputStream()));

                            outputStream.write("Howdy! newbie".getBytes());

                            s.close();

                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                });
                thread.run();
            }
        });
    }

它给了我一个 NetworkOnMainThreadException!

当我使用以下几行来消除限制时,它确实有效:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy); 

但我为什么要使用它呢?

我用了线程,为什么不在分离线程上运行,而是在UI线程上运行?!

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    改变

    thread.run();
    

    thread.start();
    

    区别:

    Thread.run() 不会产生新线程,而 Thread.start() 确实如此,即Thread.run 实际上与 调用者,而Thread.start() 创建一个新线程,任务在该线程上 正在运行。

    更多信息见Difference between running and starting a thread

    【讨论】:

    • 谢谢!这是一个很大的错误!
    • @MTP1376 乐于助人,别忘了接受,无论如何享受编码。
    【解决方案2】:

    因为您没有要求线程启动。

    替换:

    thread.run();
    

    thread.start();
    

    调用run() 只会在当前线程上执行提供的Runnable。但是,start() 将在新线程上产生执行。

    【讨论】:

    • 哈哈哈哈哈 :))) Tnx :)))
    • @MTP1376 你应该选择这个人的答案,因为它更好地解释了发生了什么:.start() 是 Java 库提供的启动线程的方法。 .run() 是 you 提供的(悲惨地命名的)方法,它告诉线程该做什么。
    【解决方案3】:

    thread.run() 更改为 thread.start()


      @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
    
                Button button = (Button) findViewById(R.id.button1);
                button.setOnClickListener(new OnClickListener() {
    
    
                    @Override
                    public void onClick(View arg0) {
                        Thread thread = new Thread(new Runnable() {
    
                            @Override
                            public void run() {
                                try {
                                    ServerSocket serverSocket = new ServerSocket(9002);
                                    Socket s = serverSocket.accept();
    
                                    DataOutputStream outputStream = new DataOutputStream(
                                            s.getOutputStream());
                                    BufferedReader inputStream = new BufferedReader(
                                            new InputStreamReader(s.getInputStream()));
    
                                    outputStream.write("Howdy! newbie".getBytes());
    
                                    s.close();
    
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                        });
                        thread.start();
                    }
                });
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-16
      • 2020-10-18
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2022-11-11
      • 2021-07-03
      相关资源
      最近更新 更多