2015-07-15 1 views
0

У меня есть сомнения в использовании обработчиков в следующем сценарииИспользование андроида обработчика, используя отдельный обработчик

У меня есть класс активности следующим образом:

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); 
    } 
} 

ответ

0

Создание пользовательского интерфейса Handler внутри фона Thread так:

private static final Handler UI_HANDLER = new Handler(Looper.getMainLooper()); 

, то вы можете send сообщение или postRunnable для UI нить. Для обработки сообщения в вашей деятельности, вы можете создать еще один обработчик внутри вашей деятельности и переопределить handleMessage метод как это:

@Override 
    public void handleMessage(Message inputMessage) { 
     if (message.what == YOUR_MESSAGE_CODE) { 
      ... 
     } 
    } 
+0

У меня есть буфер из сети. Могу ли я отправить это сообщение? Если я получаю входящие данные, и я изменяю буфер, не будут ли повреждены данные, которые будут доступны в потоке пользовательского интерфейса? Должен ли я каким-то образом синхронизировать доступ или просто отправить сообщение достаточно? – mindentropy

+0

Если буфер невелик (менее 500 кб), вы можете отправить его как сообщение, иначе вам нужно будет его где-то сохранить, например. в файл, а затем читать из этого файла при обработке сообщения. Обработчик использует Looper, который использует MessageQueue. Он всегда последователен, поэтому он уже синхронизирован для вас. Вы не можете одновременно обрабатывать сообщения на одном и том же Looper. –

+0

Извините, предел 1MB, см. Эту ссылку: http://stackoverflow.com/questions/8552514/is-there-some-limits-in-android-bundle –