【问题标题】:How to execute a method outside of run() in a backgroud thread?如何在后台线程中执行 run() 之外的方法?
【发布时间】:2019-07-29 10:00:25
【问题描述】:

我已经建立了套接字连接。我有服务正在运行,它接收来自活动的意图以启动SO Connection。我知道socket 连接应该在后台线程中。我的插座连接正确。现在我想使用outputstream 发送一些字节。这就是我遇到问题的地方。

public class myLocalThread extends Thread {

    private InetAddress serverAddress;
    private int serverPort;

    Socket clientSocket;
    BufferedInputStream inputStream;
    BufferedOutputStream outputStream;

    @Override
    public void run(){

        try {
            clientSocket = new Socket(serverAddress, serverPort);
            outputStream = new BufferedOutputStream(clientSocket.getOutputStream());
            inputStream = new BufferedInputStream(clientSocket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Start thread for receiving messages
        new Thread() {
            @Override
            public void run() {

                int bytes_read = 0;
                byte[] buffer = new byte[1024];

                while(true) {
                    try {
                        if ((bytes_read = inputStream.read(buffer, 0, buffer.length)) > 0){

                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
           }
        }.start();
    }

  public void outputMessage(byte[] message) throws IOException {
        outputStream.write(new byte[]{
                (byte) 0x01
        });
        outputStream.flush();
    }
}

我有outputMessage 的设置意图,每当我访问此方法时,我都会再次遇到Mainthread。我不明白(这是一个后台线程,不是吗?)。如何在我的线程中访问此方法?提前致谢。

编辑:我使用广播接收器访问 Intent,如下所示

 public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        myLocalThread thread;
        String action = intent.getAction();

        if(action.equals("com.example.app.START")){
         thread = new myLocalThread();
         thread.start(); 
        } else if (action.equals("com.example.app.SEND")){
            try {
                thread.sendMessage(new byte[]{
                        (byte) 0x02
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

【问题讨论】:

  • 你在哪里调用了outputMessage?贴一点代码..
  • 如果你想从你的线程中访问它,你应该从你的线程的 run 方法中调用它。
  • @NAIT 你的意思是最后这样吗? run(){ this.outputMessage() }
  • outputmessage方法应该在线程的run方法内部调用
  • @SantanuSur 类似run(){this.outputMessage()} 吗?或者你能告诉我怎么做吗?

标签: java android sockets background-thread


【解决方案1】:

我建议从您帖子的 cmets 中提到的线程的 run 方法调用它。

您的代码中还有一些奇怪的东西我不明白,为什么要在run 方法中创建一个线程。这是你故意做的事情吗?因为每次您在myLocalThread 上调用start 时,这将创建2 个线程。

在下面的代码中,我删除了 run 方法中第二个线程的使用,并添加了对 outputMessage 方法的调用,我没有尝试过这段代码,所以我只是为了说明钱包。

类似的东西

public class myLocalThread extends Thread {

    private InetAddress serverAddress;
    private int serverPort;

    Socket clientSocket;
    BufferedInputStream inputStream;
    BufferedOutputStream outputStream;

    @Override
    public void run(){

        try {
            clientSocket = new Socket(serverAddress, serverPort);
            outputStream = new BufferedOutputStream(clientSocket.getOutputStream());
            inputStream = new BufferedInputStream(clientSocket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }


        int bytes_read = 0;
        byte[] buffer = new byte[1024];

        while(true) {
             try {
                   if ((bytes_read = inputStream.read(buffer, 0, buffer.length)) > 0){

                   }
              } catch (IOException e) {
                  e.printStackTrace();
              }
        }
        outputMessage(new byte[]{(byte) 0x01});

    }

    public void outputMessage(byte[] message) throws IOException {
        outputStream.write(message);
        outputStream.flush();
    }
}

【讨论】:

  • 只是为了避免碰到MainThreadException。这就是我创建第二个线程的原因
  • 我无法调用方法outputMessage()。我应该传入字节吗?
  • 是的,您可以将字节从 run 方法传递给 ouputMessage。
  • 但我不想这样发送。我想通过接收意图单击按钮后发送字节。
  • 我编辑了上面的消息以使用字节数组调用
猜你喜欢
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多