Я искал связь между потоком и петлером, и я просто знаю, что означает буквальный смысл двух слов. Когда приходят в конкретные условия, я все еще немного смущен.Должен ли я вызвать Looper.prepare() в потоке?
Я столкнулся с этой проблемой при попытке создать приложение для связи с устройством Bluetooth. У меня проблемы с подключением.
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
private String mSocketType;
public ConnectThread(BluetoothDevice device, boolean secure) {
mmDevice = device;
BluetoothSocket tmp = null;
mSocketType = secure ? "Secure" : "Insecure";
// Get a BluetoothSocket for a connection with the
// given BluetoothDevice
try {
if (secure) {
tmp = device.createRfcommSocketToServiceRecord(
MY_UUID_SECURE);
} else {
tmp = device.createInsecureRfcommSocketToServiceRecord(
MY_UUID_INSECURE);
}
} catch (IOException e) {
tip("Socket Type: " + mSocketType + "create() failed");
}
mmSocket = tmp;
}
public void run() {
Looper.prepare();
setName("ConnectThread" + mSocketType);
// Always cancel discovery because it will slow down a connection
if(mBluetoothAdapter.isDiscovering())
mBluetoothAdapter.cancelDiscovery();
// Make a connection to the BluetoothSocket
try {
// This is a blocking call and will only return on a
// successful connection or an exception
mmSocket.connect();
} catch (IOException e) {
// Close the socket
try {
mmSocket.close();
} catch (IOException e2) {
e2.printStackTrace();
}
connectionFailed();
return;
}
// Reset the ConnectThread because we're done
synchronized (BluetoothThreads.this) {
mConnectThread = null;
}
// Start the connected thread
connected(mmSocket, mmDevice, mSocketType);
Looper.loop();
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
}
}
}
этот код загружен с образца разработчика Android. и Looper.prepare(), Looper.loop() добавляются мной. Если вы вызовете эти два метода, приложение выйдет из строя. И я получил предупреждение от студии Android: Не могу создать обработчик внутри потока, который не вызвал Looper.prepare(). Вот почему я добавляю два метода.
Я хочу спросить, правильно ли я называю эти два метода?
Почему я должен назвать их, пока я не использовал Toast или Handler, как это делают другие?
Не могли бы вы указать ссылку, откуда вы взяли этот код. –
[BluetoothChat] (http://developer.android.com/intl/zh-cn/samples/BluetoothChat/index.html) это ссылка, откуда я загрузил образец кода. И я должен упомянуть, что я успешно выполнил образец на своем телефоне. Но когда я пытаюсь самостоятельно построить новый проект, подобный образцу, у меня возникают проблемы с ConnectThread. – Wtswkz
Убедитесь, что ваш файл build.gradle (доступный внутри папки приложения) похож на файл buid.gradle образца (доступный внутри папки приложения). Выполняя сравнение, сосредоточьтесь на версиях sdk, упомянутых в файле gradle. –