在这个应用程序中,我正在通过wifi direct p2p连接两个设备,其中一个是“主机”,另一个是“客户端”。然后,我对在设备之间发送消息的功能进行了编码。客户端可以很好地发送消息,但是当主机尝试发送消息时,应用程序崩溃,这是发送消息的代码:
static final int MESSAGE_READ = 1;
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_READ:
byte[] readBuff = (byte[]) msg.obj;
String tempMsg = new String(readBuff, 0, msg.arg1);
read_msg_box.setText(tempMsg);
break;
}
return true;
}
});
public class ServerClass extends Thread {
Socket socket;
ServerSocket serverSocket;
@Override
public void run() {
super.run();
try {
serverSocket = new ServerSocket(8888);
socket = serverSocket.accept();
sendReceive = new SendReceive(socket);
sendReceive.start();
} catch (IOException e) {
Log.v("MainActivity", "" + e);
}
}
}
private class SendReceive extends Thread {
private Socket socket;
private InputStream inputStream;
private OutputStream outputStream;
public SendReceive(Socket skt) {
socket = skt;
try {
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
} catch (IOException e) {
Log.v("MainActivity", "" + e);
}
}
@Override
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (socket != null) {
try {
bytes = inputStream.read(buffer);
if (bytes > 0) {
handler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();
}
} catch (IOException e) {
Log.v("MainActivity", "" + e);
}
}
}
public void write(byte[] bytes) {
try {
outputStream.write(bytes);
} catch (IOException e) {
Log.v("MainActivity", "" + e);
}
}
}
public class ClientClass extends Thread {
Socket socket;
String hostAdd;
public ClientClass(InetAddress hostAddress) {
hostAdd = hostAddress.getHostAddress();
socket = new Socket();
}
@Override
public void run() {
try {
socket.connect(new InetSocketAddress(hostAdd, 8888), 500);
sendReceive = new SendReceive(socket);
sendReceive.start();
} catch (IOException e) {
Log.v("MainActivity", "" + e);
}
}
}
以及在以编辑文本形式写入消息后单击“ btnSend”按钮时的代码(“ writeMsg”是一个EditText对象):
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = writeMsg.getText().toString();
sendReceive.write(msg.getBytes());
}
});
这是我在主机设备上按“发送”时显示的错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hosse.myapplication, PID: 8546
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.
onNetwork(StrictMode.java:1303)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:145)
at com.example.hosse.myapplication.MainActivity
$SendReceive.write(MainActivity.java:292)
at com.example.hosse.myapplication.MainActivity
$4.onClick(MainActivity.java:138)
at android.view.View.performClick(View.java:6261)
at android.widget.TextView.performClick(TextView.java:11164)
at android.view.View$PerformClick.run(View.java:23752)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit
$MethodAndArgsCaller.run(ZygoteInit.java:1510)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1400)
那么我在做错什么导致了此错误?预先感谢。