Android 只有创建视图层次结构的原始线程才能接触其视图
我正在尝试获取一个ImageView,以便在我的drawable文件夹中的两个图像之间设置动画 我原以为一切正常,但日志显示了一个错误:Android 只有创建视图层次结构的原始线程才能接触其视图,android,imageview,Android,Imageview,我正在尝试获取一个ImageView,以便在我的drawable文件夹中的两个图像之间设置动画 我原以为一切正常,但日志显示了一个错误:只有创建视图层次结构的原始线程才能接触其视图。 这是我的密码: public class ExerciseActivity extends Activity { private ExercisesDataSource datasource; private Cursor cursor; private ImageView image_1_
只有创建视图层次结构的原始线程才能接触其视图。
这是我的密码:
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));
}
}
}
我继续将类和函数设置为public,但这并没有解决它
所有资源和一切都正常,如何修复此错误?您在
TickClass
中的代码在另一个线程上运行。要从这里执行UI工作,请使用runOnUiThread
。
有关详细信息,请参阅
runOnUiThread(new Runnable() {
public void run() {
image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
}
});
您应该使用处理程序 在onCreate中创建处理程序。然后将处理程序与其他线程一起使用。 将代码包装在post中,此代码将在UI线程上执行,这可能会更改UI组件 “公共最终布尔post(Runnable r) 在API级别1中添加 导致将Runnable r添加到消息队列。Runnable将在连接此处理程序的线程上运行。“
你应该给出完整的堆栈,这将很有帮助…你如何在一个片段上做这件事的可能重复?你如何在一个简单的堆栈中做这件事class@AlexanderMladzhov它是
活动的一种方法,因此需要对活动的引用才能调用它。或者,您可以使用处理程序
,如Nicklas Gnejs Eriksson的回答所示。
handler.post( new Runnable() {
@Override
public void run() {
image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
}
});