Только исходный поток, создавший иерархию представлений, может коснуться его представлений
Я пытаюсь получить ImageView для анимации между двумя изображениями в моей доступной папке.
Я думал, что все будет нормально работать, но журнал показывает ошибку: Only the original thread that created a view hierarchy can touch its views.
Вот мой код:
public class ExerciseActivity extends Activity {
private ExercisesDataSource datasource;
private Cursor cursor;
private ImageView image_1_view;
private Timer _timer;
private int _index;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);
datasource = new ExercisesDataSource(this);
datasource.open();
cursor = datasource.fetchExercise(exerciseDataID);
image_1_view = (ImageView) findViewById(R.id.exercise_image);
_index = 1;
_timer = new Timer();
_timer.schedule(new TickClass(), 1000);
}
public class TickClass extends TimerTask
{
private int columnIndex;
@Override
public void run() {
if (_index == 1) {
columnIndex = cursor.getColumnIndex(MySQLiteHelper.COLUMN_IMAGE_1);
_index = 2;
}
else {
columnIndex = cursor.getColumnIndex(MySQLiteHelper.COLUMN_IMAGE_2);
_index = 1;
}
String image_1 = cursor.getString(columnIndex);
image_1 = image_1.replace(".png", "");
int resourceId = getResources().getIdentifier(getPackageName() + ":drawable/" + image_1, null, null);
image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
}
}
}
Я пошел вперед и установил классы и функции для публики, но это не исправить.
Все ресурсы и все в порядке, как я могу исправить эту ошибку?
Ответы
Ответ 1
Ваш код в TickClass
работает в другом потоке. Для выполнения работы пользовательского интерфейса используйте runOnUiThread
.
Подробнее см. document.
runOnUiThread(new Runnable() {
public void run() {
image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
}
});
Ответ 2
Вы должны использовать обработчик. http://developer.android.com/reference/android/os/Handler.html
Создайте обработчик в onCreate. Затем используйте обработчик в другом потоке.
Заверните код внутри сообщения, и этот код будет выполнен в потоке пользовательского интерфейса, который может изменить компоненты пользовательского интерфейса.
"публичный конечный логический пост (Runnable r)
Добавлено в уровень API 1
Заставляет Runnable r добавляться в очередь сообщений. Runnable будет запущен в потоке, к которому прикреплен этот обработчик. "
handler.post( new Runnable() {
@Override
public void run() {
image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
}
});