Проблема Android TextView в run () - PullRequest
0 голосов
/ 07 ноября 2018
class BTCSync extends Thread{
        public void run(){
            while(!BTC && MainPage.BTC){
                TextView BTCPer = (TextView) findViewById(R.id.lblBTCPer);
                BTCPer.setText(BTCProgress+"%");
                if(BTCProgress == 100) {
                    BTCPer.setText("100%");
                    BTC = true;
                }
            }
        }
    }

Ошибка в том, где findViewById моя метка lblBTCPer.

Причина, по которой он у меня есть в run(), заключается в том, что этот блок должен работать, пока значение не достигнет 100.

Я знаю, что обычно вам нужно добавить View v, но тогда это сведет на нет void run ().

Я искал несколько решений, но я не нашел рабочего примера.

Я также полагаю, что опубликовал это уже вчера, но, похоже, нигде не могу его найти. Его нет в моем аккаунте, и я отчетливо помню, как опубликовал его и ждал ответов.

Ответы [ 4 ]

0 голосов
/ 07 ноября 2018

Android запрещает изменение пользовательского интерфейса (например, установка текста текстового представления) вне потока пользовательского интерфейса .

Если вы можете позвонить по этой линии

TextView BTCPer = (TextView) findViewById(R.id.lblBTCPer);

тогда это означает, что ваш поток определен внутри вашей деятельности, потому что findViewById() не является функцией Thread. В этом случае:

class BTCSync extends Thread{
        public void run(){
            while(!BTC && MainPage.BTC){
                TextView BTCPer = (TextView) findViewById(R.id.lblBTCPer);
                // make sure you enable lambdas
                runOnUiThread(() -> BTCPer.setText(BTCProgress+"%"));
                if(BTCProgress == 100) {
                    BTCPer.setText("100%");
                    BTC = true;
                }
            }
        }
0 голосов
/ 07 ноября 2018

Помимо проблемы findViewById, вы пытаетесь работать с пользовательским интерфейсом в потоке без пользовательского интерфейса. Вам нужно будет использовать runOnUiThread (), иначе вы получите сбой:

    runOnUiThread(new Runnable() {
    @Override
    public void run() {
            BTCPer.setText(BTCProgress+"%");
            if(BTCProgress == 100) {
                BTCPer.setText("100%");
                BTC = true;
            }
    }
});
0 голосов
/ 07 ноября 2018

Android-приложение имеет только один поток пользовательского интерфейса , а инструментарий пользовательского интерфейса Android не является поточно-ориентированным и всегда должен обрабатываться в потоке пользовательского интерфейса.

Чтобы обновить пользовательский интерфейс в другом потоке, вы можете использовать handler, здесь ref

и вот хороший пример

0 голосов
/ 07 ноября 2018

findViewById() является функцией Android Активность или Просмотр . Ваш BTCSync класс не распространяется ни на один из них.

Скорее всего Timertask или Handler будет лучше всего соответствовать вашим требованиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...