У меня есть сомнения в использовании обработчиков в следующем сценарииИспользование андроида обработчика, используя отдельный обработчик
У меня есть класс активности следующим образом:
public class MyActivity extends Activity {
...
...
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
...
}
}
и класс BluetoothClientConnection следующим
public class BTClientConnection extends Thread {
public void run {
...
}
}
Теперь я хочу обновить пользовательский интерфейс с помощью обработчиков. Как я должен это делать? Должен ли я создать переменную public handler и ссылаться на нее непосредственно из моего кода BluetoothClientConnection? Является ли это лучшей практикой, поскольку я буду напрямую связываться с классом MyActivity.
От Gennadii Сапрыкин ответ должен окончательный код будет
public class MyActivity extends Activity {
...
private ActivityHandler activityhandler = new ActivityHandler();
static class ActivityHandler extends Handler {
@Override
public void handleMessage(Message msg) {
}
...
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
...
BTClientConnection btClientConnection = new BTClientConnection(..);
btClientConnection.start();
}
}
public class BTClientConnection extends Thread {
private static final Handler UI_HANDLER = new Handler(Looper.getMainLooper());
public void run {
Message message = new Message();
UI_HANDLER.sendMessage(message);
}
}
У меня есть буфер из сети. Могу ли я отправить это сообщение? Если я получаю входящие данные, и я изменяю буфер, не будут ли повреждены данные, которые будут доступны в потоке пользовательского интерфейса? Должен ли я каким-то образом синхронизировать доступ или просто отправить сообщение достаточно? – mindentropy
Если буфер невелик (менее 500 кб), вы можете отправить его как сообщение, иначе вам нужно будет его где-то сохранить, например. в файл, а затем читать из этого файла при обработке сообщения. Обработчик использует Looper, который использует MessageQueue. Он всегда последователен, поэтому он уже синхронизирован для вас. Вы не можете одновременно обрабатывать сообщения на одном и том же Looper. –
Извините, предел 1MB, см. Эту ссылку: http://stackoverflow.com/questions/8552514/is-there-some-limits-in-android-bundle –