Приложение зависает при настройке текста TextView - PullRequest
0 голосов
/ 30 декабря 2018

Мне нужно обновить TextView из другого класса (не действия) с результатом от метода, который может быть медленным, чтобы завершить поиск.Хотя метод не заканчивается, я подумал, что для текста TextView нужно что-то вроде «загрузка ...» и, наконец, после того, как результат метода в порядке, установите текст для этого результата.В настоящее время я делаю что-то вроде этого:

textView.setText("loading...");
Search s = searcher.search();
textView.setText(s.result);

Во-первых, это по-прежнему замораживает приложение до тех пор, пока результат не будет удовлетворительным, когда-то не использовал новый Threads.Я знаю, что для установки контента на виджеты Android мы должны сделать это внутри uiThread, но я не знаю, как это сделать в моем случае, если я не внутри Activity.

Во-вторых, при таком подходе текст "загрузка ..." не отображается.Когда я вызываю этот код, приложение просто останавливается и возвращается с окончательным текстом.

Тогда, как избежать этого замораживания / взлома, пока содержимое не будет в порядке?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Я думаю, что главное понять, что в потоке пользовательского интерфейса должны выполняться только задачи, специфичные для пользовательского интерфейса.Если это не связано с пользовательским интерфейсом, то он должен работать в другом потоке, в идеале как AsyncTask.

Выполнение поиска, вообще говоря, очень сильно влияет на производительность, как вы указали.Это заблокирует поток пользовательского интерфейса от обновления пользовательского интерфейса, что приведет к не отвечающим пользовательским интерфейсам, и пользователи могут воспринимать это как сбой или медленное приложение.

Итак, во-первых, чтобы запустить обновление в потоке пользовательского интерфейса.

runOnUiThread(() ->{textView.setText("loading...");});

, затем выполните поиск в другом потоке

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

0 голосов
/ 30 декабря 2018

Не выполняйте тяжелых операций внутри MainThread (UI) в Android.Для вашего случая взгляните на AsyncTask .Он дает вам метод doInBackground, в котором вы должны выполнить некоторые фоновые операции (запрос http, файл ввода / вывода), после чего вы получите вызов onPostExecute, этот метод будет вызван в потоке пользовательского интерфейса с результатами метода doInBackground. Другой пример .

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