【问题标题】:How can I access the variable from run() method?如何从 run() 方法访问变量?
【发布时间】:2021-12-27 10:17:22
【问题描述】:

我是线程概念的新手。我正在android中进行套接字编程。我想以各种方法使用从客户那里收到的消息。但是我无法从 Runnable 接口的 run() 方法访问消息。下面是我的代码
'''

class Thread1 implements Runnable {
        @Override
        public void run() {
            Socket socket;
            while (true) {
                try {
                    serverSocket = new ServerSocket(SERVER_PORT);
                    socket = serverSocket.accept();
                    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String message = input.readLine();
                    if (message != null) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                tvMessages.setText("" + message + "\n");
                            }
                        });
                    } else {
                        return;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

'''

这里我想在不同的类或方法中使用消息变量。

【问题讨论】:

  • 试试Handler
  • 消息变量将是全局的
  • 我是新手,您可以给我任何关于如何在这里使用处理程序的参考
  • 我已经尝试使用消息变量作为全局变量。它没有帮助
  • 不要使用全局变量,如果被多个线程访问可能会导致错误。

标签: java android multithreading runnable serversocket


【解决方案1】:

您可以简单地在您的活动中创建一个处理程序对象,例如Handler activtyHandler = new Handler(),然后将此处理程序传递给您正在创建的线程对象,然后发布您想要在活动上运行的任何代码,如下所示

    mHandler.post(new Runnable() {
     @Override                        
     public void run() {
      tvMessages.setText("" + message + "\n");
     }
   });

【讨论】:

    【解决方案2】:

    为您的特定代码制作消息变量final

    final String message = input.readLine();
    

    附带说明一下,tvMessages 来自哪里?明明是一个TextView,但它是如何到达类实现的呢?您应该将 tvMessages 更改为 WeakReference 而不是强引用,因为在代码中使用它可能会产生 Activity 上下文泄漏。

    另外,虽然问题中没有问,但与其在收到消息时创建一个新的runnable,不如在创建工作线程之前创建一个绑定到主线程的Handler,然后使用它会更高效将消息发送到 UI。这样可以避免很多不必要的可运行实例。

    【讨论】:

      【解决方案3】:

      不是 100% 确定问题出在哪里,但您可能缺少 final 关键字?例如下面的作品。

      final String message = "hello";
      runOnUiThread(new Runnable() {
          @Override
          public void run() {
              System.out.println("" + message + "\n");
          }
      });
      

      没有final你应该得到以下错误:

      Cannot refer to the non-final local variable message defined in an
      enclosing scope
      

      您还可以使用字段创建类:

      static class MyRunnable implements Runnable {
          private final String message;
          public MyRunnable(String message) {
              this.message = message;
          }
          @Override
          public void run() {
              System.out.println("" + message + "\n");
          }
      }
      

      那么你会像这样使用它:

      final String message = "hello";
      runOnUiThread(new MyRunnable(message));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-29
        • 2019-08-05
        • 1970-01-01
        • 1970-01-01
        • 2016-03-14
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        相关资源
        最近更新 更多