Ошибка присвоения значения textview в классе thread

#android

#Android

Вопрос:

У меня есть textview на одной из страниц с именем txtdownloadStatus.У меня есть класс thread, который загружает некоторые данные, и если он завершен, я хочу показать завершенный в textview, который размещен на странице, о которой я говорил ранее.

Имя моего пользовательского интерфейса

 download_manifest.txtdownloadStatus.setText("Completed Download");
 

Класс потока такой, как указано ниже

 public class thread_download extends Thread {
    private download_helper downloadhelper;
    private Context context;
    public thread_download(Context context) {
        this.context = context;
    }
     public void run() {

           downloadhelper = new download_helper(this.context);

            try {
                downloadhelper.DownloadProblemAndReasonCode();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                downloadhelper.DownloadNewManifest();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                downloadhelper.DownloadNewMessages();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            downloadhelper.DeleteOldManifest();
            try {
            download_manifest.txtdownloadStatus.setText("Cpmpleted");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

}
 

Проблема в том, что когда я попытался установить значение для textview в классе thread.Он показывает ошибку, подобную приведенной ниже

android.view.ViewRoot $CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться своих представлений.

Кто-нибудь мне поможет

Ответ №1:

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

вы должны использовать runOnUIThread() метод.

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

Ответ №2:

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

Ответ №3:

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