- Регистрация
- 9 Май 2015
- Сообщения
- 1,071
- Баллы
- 155
- Возраст
- 51
Большинство популярных статей и руководств по многопоточному программированию в Android гласит, что из класса Thread пользовательский интерфейс недоступен и вообще рекомендуют использовать AsyncTask.
В их рекомендациях есть определённый смысл. Всё-таки AsyncTask это собственный класс Android SDK, разработанный с учётом особенностей платформы. В то время как Thread относится к стандартному Java SE.
Но, с помощью AsyncTask не всегда можно решить поставленную задачу эффективно. Более того некоторые задачи решаются только с применением Thread (особенно, если речь заходит о сложных случаях). Кроме того, для Thread можно добавить недостающие возможности по работе с интерфейсом пользователя и для этого совершенно не обязательно быть системным программистом.
Как известно в Java можно создавать собственные классы потоков наследуясь от Thread. Создадим такой класс.
Внутри класса сразу же добавим два закрытых поля, которые будем инициализировать в его конструкторе. Это activity, с графическим интерфейсом которой предстоит работать и, для удобства, сам элемент графического интерфейса, который мы планируем изменять. В качестве примера, пусть это будет обычный TextView, в котором мы будем выводить некоторый текст.
private Activity activity;
private TextView textView;
. . .
public MyThread(Activity act, TextView tView) {
activity = act;
textView = tView;
}
В Android любое взаимодействие с пользовательским интерфейсом возможно только из UI-потока. Поэтому, нам необходимо в начале получить к нему доступ.
Для этого у класса Activity имеется специальный метод runOnUiThread. Этот метод принимает один единственный параметр – объект Runnable. В методе run этого объекта собственно и будут выполняться все манипуляции.
В нашем примере это будет просто вывод текста.
Вызов метода runOnUiThread лучше выполнять в методе run потока, как это показано в примере ниже.
@Override
public void run() {
activity.runOnUiThread(new Runnable() {
public void run() {
textView.setText("Changed!");
}
});
}
В результате выполнения данного кода в textView будет выведена надпись «Changed!».
Таким не хитрым способом можно свободно работать с графическим интерфейсом из Thread потока.
В их рекомендациях есть определённый смысл. Всё-таки AsyncTask это собственный класс Android SDK, разработанный с учётом особенностей платформы. В то время как Thread относится к стандартному Java SE.
Но, с помощью AsyncTask не всегда можно решить поставленную задачу эффективно. Более того некоторые задачи решаются только с применением Thread (особенно, если речь заходит о сложных случаях). Кроме того, для Thread можно добавить недостающие возможности по работе с интерфейсом пользователя и для этого совершенно не обязательно быть системным программистом.
Как известно в Java можно создавать собственные классы потоков наследуясь от Thread. Создадим такой класс.
Внутри класса сразу же добавим два закрытых поля, которые будем инициализировать в его конструкторе. Это activity, с графическим интерфейсом которой предстоит работать и, для удобства, сам элемент графического интерфейса, который мы планируем изменять. В качестве примера, пусть это будет обычный TextView, в котором мы будем выводить некоторый текст.
private Activity activity;
private TextView textView;
. . .
public MyThread(Activity act, TextView tView) {
activity = act;
textView = tView;
}
В Android любое взаимодействие с пользовательским интерфейсом возможно только из UI-потока. Поэтому, нам необходимо в начале получить к нему доступ.
Для этого у класса Activity имеется специальный метод runOnUiThread. Этот метод принимает один единственный параметр – объект Runnable. В методе run этого объекта собственно и будут выполняться все манипуляции.
В нашем примере это будет просто вывод текста.
Вызов метода runOnUiThread лучше выполнять в методе run потока, как это показано в примере ниже.
@Override
public void run() {
activity.runOnUiThread(new Runnable() {
public void run() {
textView.setText("Changed!");
}
});
}
В результате выполнения данного кода в textView будет выведена надпись «Changed!».
Таким не хитрым способом можно свободно работать с графическим интерфейсом из Thread потока.