我正在尝试让ImageView在我的drawable文件夹中的两个图像之间设置动画。
我认为一切都会正常,但日志显示错误: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));
}
}
}
我继续将类和功能设置为公开,但是没有解决它。
所有资源和一切都很好,我该如何解决这个错误?
答案 0 :(得分:38)
TickClass
中的代码在另一个线程上运行。要从此处执行UI工作,请使用runOnUiThread
。
有关详细信息,请参阅docu。
runOnUiThread(new Runnable() {
public void run() {
image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
}
});
答案 1 :(得分:3)
您应该使用处理程序。 http://developer.android.com/reference/android/os/Handler.html
在onCreate中创建处理程序。然后在另一个线程中使用处理程序。 将代码包装在帖子中,此代码将在UI线程上执行,这可能会更改UI组件。
“public final boolean post(Runnable r) 在API级别1中添加
使Runnable r添加到消息队列中。 runnable将在连接此处理程序的线程上运行。“
handler.post( new Runnable() {
@Override
public void run() {
image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
}
});