Обновление пользовательского интерфейса из обработчика - PullRequest
1 голос
/ 12 апреля 2019

Я использую обработчик для связи с другим потоком, который отвечает за связь по Bluetooth. Когда связь установлена, я хочу отправить список массивов байтов и показать прогресс.

Handler handler = new Handler(Looper.getMainLooper()) {
                        @Override
                        public void handleMessage(Message inputMessage) {
                            switch (inputMessage.what) {
                                case CONNECTION_STATE:
                                    connected = (boolean) inputMessage.obj;
                                    Log.d(TAG, "connected= " + String.valueOf(connected));
                                    if (connected) {
                                        for (int i = 0; i < data2send.size(); i++) {
                                            if (!isCancelled) {
                                                isPrinting = true;
                                                printButton.setText(getString(R.string.cancel));
                                                byte[] bytes2send = new byte[data2send.get(i).getDataLength()];
                                                System.arraycopy(data2send.get(i).getData(), 0, bytes2send, 0, data2send.get(i).getDataLength());
                                                try {
                                                    int progress = (i+1) * 100 / data2send.size();
                                                    Log.d(TAG, "onProgressUpdate: progress = " + progress + " %");
                                                    String statusString = getString(R.string.sending_page) + String.valueOf(i+1) + getString(R.string.of) + String.valueOf(data2send.size());
                                                    Log.d(TAG, statusString);
                                                    status.setText(statusString);
                                                    progressBar.setProgress(progress);
                                                    connectThread.write(bytes2send);
                                                } catch (Exception e) {
                                                    Log.e(TAG, "connection error");
                                                }
                                            } else {
                                                isPrinting = false;
                                                printButton.setText(getString(R.string.print_caps));
                                                break;
                                            }
                                        }
                                    }
                                    break;
                            }
                        }
                    };
                    connectThread = new ConnectThread(printer, handler);
                    connectThread.start();
                }

Ни содержимое TextView, ни ProgressBar не могут быть обновлены при отправке данных, но ведение журнала работает (log.d).

1 Ответ

0 голосов
/ 12 апреля 2019

В вашем Activity создайте новый void

private void updateUI(final String statusString, final int progress) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            status.setText(statusString);
            progressBar.setProgress(progress);            
        }
    });

}

Затем внутри вашего обработчика

 try {
     int progress = (i+1) * 100 / data2send.size();
     Log.d(TAG, "onProgressUpdate: progress = " + progress + " %");
     String statusString = getString(R.string.sending_page) + String.valueOf(i+1) + getString(R.string.of) + String.valueOf(data2send.size());
     Log.d(TAG, statusString);
     updateUI(statusString, progress);
    ...
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...