Android - не-пользовательский интерфейс, отображающий мой пользовательский интерфейс без ответа - PullRequest
0 голосов
/ 01 июня 2018

Когда я вызываю эту ветку в своей деятельности, пользовательский интерфейс перестает отвечать на запросы, и поэтому я не могу ничего сделать после его запуска.Я бы предположил, что это связано с потоками ввода / вывода, но я не уверен, как решить проблему.Буду признателен за любую помощь, но я новичок в Android и многопоточности, поэтому у меня могут быть некоторые дополнительные вопросы.

Вот моя тема:

 mHandler = new Handler();

    new Thread(new Runnable() {
        @Override
        public void run () {
            mHandler.post(new Runnable() {
                @Override
                public void run () {
                    int counter = 0;
                    while (true) {
                        counter++;
                        try {
                            output = "";
                            if (mInStream != null) {
                                mInStream.read(buffer);
                                for (byte b : buffer) {
                                    char c = (char) b;
                                    if (c >= ' ' && c < 'z') {
                                        //System.out.print(c);
                                        output += c;
                                    }
                                }
                                //System.out.println();
                                Intent intent = new Intent();
                                intent.setAction("com.curie.WEIGHT_RECEIVED");
                                intent.putExtra("Output",output);

                                if (counter % 10 == 0) {
                                    System.out.println(counter);
                                    LocalBroadcastManager.getInstance(InputActivity.getContext()).sendBroadcastSync(intent);
                                }
                            }
                            // Send the obtained bytes to the UI Activity
                        } catch (IOException e) {
                            //an exception here marks connection loss
                            //send message to UI Activity
                            break;
                        }
                    }
                }
            });
        }
    }).start();

РЕДАКТИРОВАТЬ: Ответ действительно решил мою проблему, хотя я сейчас получаю эту ошибку, хотя.Эта ошибка возникает, когда я вызываю inputwindow.setText(weight), который устанавливает текст в TextView в значение, которое было передано из потока.

E/AndroidRuntime: FATAL EXCEPTION: Thread-2358
        Process: com.example.curie.fairbanks_03, PID: 15718
        android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8358)
        at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1364)
        at android.view.ViewGroup.invalidateChild(ViewGroup.java:5433)
        at android.view.View.invalidateInternal(View.java:13997)
        at android.view.View.invalidate(View.java:13961)
        at android.view.View.invalidate(View.java:13945)
        at android.widget.TextView.checkForRelayout(TextView.java:8403)
        at android.widget.TextView.setText(TextView.java:5011)
        at android.widget.TextView.setText(TextView.java:4836)
        at android.widget.TextView.setText(TextView.java:4811)
        at com.example.curie.fairbanks_03.InputActivity$2.onReceive(InputActivity.java:67)
        at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:311)
        at android.support.v4.content.LocalBroadcastManager.sendBroadcastSync(LocalBroadcastManager.java:289)
        at com.example.curie.fairbanks_03.BluetoothConnection$2.run(BluetoothConnection.java:176)
        at java.lang.Thread.run(Thread.java:818)

1 Ответ

0 голосов
/ 01 июня 2018

Это делает ваш пользовательский интерфейс не отвечающим, потому что он запускает в потоке пользовательского интерфейса !Вы запускаете новый поток для выполнения задачи, но затем в этом потоке вы вызываете mHandler.post, который просто возвращается к потоку, в котором был создан mHandler, который является потоком пользовательского интерфейса.Нет причин делать это.Просто выполните операцию в созданном вами потоке, не вызывая обработчик.

new Thread(new Runnable() {
    @Override
    public void run () {
        int counter = 0;
        while (true) {
            counter++;
            try {
                output = "";
                if (mInStream != null) {
                    mInStream.read(buffer);
                    for (byte b : buffer) {
                        char c = (char) b;
                        if (c >= ' ' && c < 'z') {
                            //System.out.print(c);
                            output += c;
                        }
                    }
                    //System.out.println();
                    Intent intent = new Intent();
                    intent.setAction("com.curie.WEIGHT_RECEIVED");
                    intent.putExtra("Output",output);

                    if (counter % 10 == 0) {
                        System.out.println(counter);
                        LocalBroadcastManager.getInstance(InputActivity.getContext()).sendBroadcastSync(intent);
                    }
                }
                // Send the obtained bytes to the UI Activity
            } catch (IOException e) {
                //an exception here marks connection loss
                //send message to UI Activity
                break;
            }
        }
    }
}).start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...