我已建立套接字连接。我正在运行的服务,它从活动接收启动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
。我不明白(这是一个后台线程,不是吗?如何在我的线程中访问此方法?提前谢谢。
编辑:我使用广播接收器访问意图,如下所示
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();
}
}
}
}
我建议从您的帖子评论中提到的线程的run
方法调用它。
你的代码中还有一些我不明白的奇怪东西,你为什么要在run
方法中创建一个线程。这是你在做的事吗?因为每次您在 myLocalThread
上调用 start
时,这将创建 2 个线程。
在下面的代码中,我删除了运行方法中第二个线程的使用,并添加了对 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();
}
}