11

Drawable フォルダー内の 2 つの画像間で 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));
        }
    }
}

私は先に進み、クラスと関数をパブリックに設定しましたが、それは修正されませんでした.

すべてのリソースとすべてに問題はありません。このエラーを修正するにはどうすればよいですか?

4

2 に答える 2

38

あなたのコードはTickClass別のスレッドで実行されます。ここから UI 作業を行うには、 を使用しますrunOnUiThread。詳しくはドキュメントをご覧ください。

runOnUiThread(new Runnable() {
    public void run() {
        image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
    }
});
于 2013-01-12T14:35:51.200 に答える
3

ハンドラーを使用する必要があります。http://developer.android.com/reference/android/os/Handler.html

onCreate でハンドラーを作成します。次に、ハンドラーを他のスレッドで使用します。投稿内にコードをラップすると、このコードが UI スレッドで実行され、UI コンポーネントが変更される可能性があります。

" public final boolean post (Runnable r) APIレベル1で追加

Runnable r をメッセージ キューに追加します。ランナブルは、このハンドラーがアタッチされているスレッドで実行されます。」

    handler.post( new Runnable() {

        @Override
        public void run() {
            image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
        }
    });
于 2013-01-12T14:39:12.337 に答える