Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 只有创建视图层次结构的原始线程才能接触其视图_Android_Imageview - Fatal编程技术网

Android 只有创建视图层次结构的原始线程才能接触其视图

Android 只有创建视图层次结构的原始线程才能接触其视图,android,imageview,Android,Imageview,我正在尝试获取一个ImageView,以便在我的drawable文件夹中的两个图像之间设置动画 我原以为一切正常,但日志显示了一个错误:只有创建视图层次结构的原始线程才能接触其视图。 这是我的密码: public class ExerciseActivity extends Activity { private ExercisesDataSource datasource; private Cursor cursor; private ImageView image_1_

我正在尝试获取一个ImageView,以便在我的drawable文件夹中的两个图像之间设置动画

我原以为一切正常,但日志显示了一个错误:
只有创建视图层次结构的原始线程才能接触其视图。

这是我的密码:

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));
        }
    });