【发布时间】: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