Я помогаю моему другу с Android-приложением, я не понимаю, почему я не могу получить функцию Handle
, handleMessage()
, чтобы получить вызов. Я в настоящее время пытаюсь общаться через bluetooth, у меня есть поток, обрабатывающий запись и поток, обрабатывающий чтение, поэтому я думаю, что я где-то испортил. Я действительно не умею с Thread
с, мне было интересно, если кто-то может заметить мою ошибку! Я знаю, что функция записи работает, потому что я вижу, что чип bluetooth переходит в командный режим после написания кода "$$$"
.handleMessage функция не называется
MainActivity:
public class MainActivity extends Activity{
....
private final Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
System.out.println("in mHandler");//NOT CALLED
switch (msg.what) {
case (MESSAGE_READING):
byte[] readBuf = (byte[])msg.obj;
String readMessage = new String(readBuf,0,msg.arg1);
System.out.println("READ: " + readMessage);
break;
default:
System.out.println("default!");
break;
}
}
};
...
}
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mConnectThread = new ConnectThread(device, mHandler);
mConnectThread.run();
ListenerThread mListener = new ListenerThread(mConnectThread,mHandler);
mListener.run();
}
ConnectThread:
public class ConnectThread{
public final BluetoothSocket mmSocket;
public final BluetoothDevice mmDevice;
private final Handler mHandler;
public static ConnectedThread mConnectedThread;
public ConnectThread(BluetoothDevice device, Handler mHandler) {
// Use a temporary object that is later assigned to mmSocket,
// because mmSocket is final
BluetoothSocket bs = null;
mmDevice = device;
// Get a BluetoothSocket to connect with the given BluetoothDevice
try {
// MY_UUID is the app's UUID string, also used by the server code
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard Serial Port Service ID
bs = device.createRfcommSocketToServiceRecord(uuid);
} catch (IOException e) {
System.err.println("IOException in ConnectThread");
}
this.mHandler = mHandler;
mmSocket = bs;
}
public void run() {
//TODO Cancel discovery because it will slow down the connection
try {
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
} catch (IOException connectException) {
// Unable to connect; close the socket and get out
try {
mmSocket.close();
} catch (IOException closeException) { }
return;
}
// Do work to manage the connection (in a separate thread)
mConnectedThread = new ConnectedThread(mmSocket, mHandler);
mConnectedThread.run();
}
...
}
ConnectedThread:
public class ConnectedThread extends Thread {
....
public void manageConnectedSocket() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
System.out.println("Reading bytes.");
status = MESSAGE_READING;
// Send the obtained bytes to the UI activity
Message msg = Message.obtain(mHandler, MESSAGE_READING, bytes, -1, buffer);
mHandler.sendMessage(msg);
} catch (IOException e) {
System.err.println("Error reading input");
break;
}
status = READY;
}
}
...
}
ListenerThread:
public class ListenerThread extends Thread {
...
public final BluetoothSocket mmSocket;
private final Handler mHandler;
private final ConnectedThread mConnectedThread;
public ListenerThread(ConnectThread mConnectThread, Handler mHandler){
this.mHandler = mHandler;
mmSocket = mConnectThread.mmSocket;
this.mConnectedThread = mConnectThread.getConnectedThread();
}
public void run(){
while (true){
if (getStatus() == READY){
write("$$$".getBytes());
break;
}
}
}
...
}
Я посмотрел еще пару вопросов о handleMessage
, но они не помогли. Есть идеи?
EDIT: Только что поняли, что это много кода. В основном я прохожу mHandler
в разные темы, я думал, что здесь происходят какие-то плохие вещи. У меня есть ConnectThread
, ConnectedThread
и ListenerThread
. Документация для Android, на которую я смотрел, по bluetooth сказал, чтобы работать в фоновом режиме, потому что некоторые из вызовов (write
, read
, device.connect()
) блокируют вызовы.
Итак, весь мой код, который в настоящее время находится в локальных методах 'run()' в моих классах Thread, должен быть перенесен на 'start()'? – ToastyMallows
Да, это правильно – Desert
Ой, подождите, может быть, я не был достаточно ясен, вам не нужно куда-то перемещать код, просто сделайте что-то вроде mConnectThread.start() вместо mConnectThread.run(). – Desert