#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. Ваша ошибка будет исправлена.