Ich entwickle eine App, die Wifi/Tcp-Verbindung verwendet, um mit einem Roboter zu kommunizieren. Im Moment benutze ich einen einzigen Thread, um die TCP-Verbindung mit einer TcpClient-Klasse zu verwalten und eine "ConnectTask extends AsyncTask" in meiner MainActivity.Verwendung von Handler in AsyncTask
Bisher ist es das, was ich habe:
TcpClient.java
private OnMessageReceived mMessageListener = null;
private int bufferSize = 5000;
public ByteBuffer bf;
private BufferedInputStream inFromServer;
private BufferedOutputStream outFromClient;
.
.
.
public void run() {
mRun = true;
try {
//here you must put your computer's IP address.
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
Log.e("TCP Client", "C: Connecting...");
//create a socket to make the connection with the server
Socket socket = new Socket(serverAddr, SERVER_PORT);
try {
Log.i("Debug", "inside try catch");
//receives the message which the server sends back
inFromServer = new BufferedInputStream(socket.getInputStream());
outFromClient = new BufferedOutputStream(socket.getOutputStream());
bf = ByteBuffer.allocate(bufferSize);
while (mRun) {
// Log.i("Debug", "inside while mRun");
bf.order(ByteOrder.LITTLE_ENDIAN);
for (int i=0;i<5000;i++) {
int b = inFromServer.read();
if (b == -1) {
break;
}
bf.put((byte) b);
}
if (bf != null && mMessageListener != null) {
//call the method messageReceived from MyActivity class
// Log.i("Debug","Message received !");
mMessageListener.messageReceived(bf);
mMessageListener.updateBatteryLvl();
}
bf.position(0);
}
}
.
.
.
Und das ist mein ConnectTask in MainActivity:
public class ConnectTask extends AsyncTask<Void, ByteBuffer, TcpClient> {
@Override
protected TcpClient doInBackground(Void... params) {
//we create a TCPClient object and
mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() {
@Override
//here the messageReceived method is implemented
public void messageReceived(ByteBuffer message) throws IOException {
//this method calls the onProgressUpdate
byte[] resultat = new byte[4000];
resultat = message.array();
updateBatteryLvl();
message.clear();
Ich bin keine Handlers in tcpclient nicht mit oder connecttask, aber ich habe einige Tutorials gesehen, die sie für Tcp Connection benutzen und ich habe mich gefragt, warum benutzen sie es? Ich habe die Verbindung mit dem Roboter bereits getestet und erhalte die Daten, die er sendet, vollkommen in Ordnung. Werden Handler wie Semaphore verwendet, wenn Multithreads zum Beispiel in derselben Datei geschrieben werden?