Проблема многопоточности с Java и Android - PullRequest
1 голос
/ 17 ноября 2010

Я разрабатываю приложение, которое просматривает серию картинок, как пролистывание фотоальбома.Довольно стандартные вещи, я уверен.Так как изображение должно просматриваться в течение нескольких секунд, прежде чем оно автоматически изменится на следующем изображении, я решил создать поток, который показывает изображение, ждет пару секунд и затем движется.

Picthread(ImageView Image1) {
        this.image = Image1;

    }

    public void run(){

        showPicture(image);
        animal_array = new String[7];

        while (counter < 7){
            try{


                int timer = 0;

                while (timer < 2000){

                    sleep(500);

                    timer+=500;
                }
                image.post(new Runnable(){

                    public void run() {

                         showPicture(image);


                    }

                });



            }
             catch (InterruptedException e) {  
                } 
        }




    }

Это действительноработал.showPictures - это очень простой метод, который просто выбирает изображение и помещает его в ImageView.Не нужно знать об этом для моей проблемы.Сначала он не работал, logcat сказал, что я не могу коснуться представления иерархии представлений, которое не было создано в этой теме.Я не был уверен, что это значит, поэтому я набрал код

image.post(...)

.Который работал.Мой главный вопрос: почему это было необходимо?Если вы посмотрите на мой код выше, первый метод showPicture () не находится внутри кода image.post ().Но никаких исключений не зарегистрировано.Я не понимаю этого, почему пост не нужен?Но также почему я должен публиковать сообщения, поскольку Image является переменной класса, и я подумал, что ее могут просматривать все темы.Я был счастлив, что это сработало, но озадаченно.

Пожалуйста, помните, что это моя первая попытка создать нить в Java на чем-то большем, чем простые примеры из учебников.Так что я все еще в замешательстве.

Кстати, в конце концов, я бросил весь поток, и просто сделал

new Thread(new Runnable() {
            public void run() {...}

1 Ответ

1 голос
/ 17 ноября 2010

При выполнении «дел» с GUI вы всегда должны быть в потоке GUI. Это то, что делает View.post(Runnable), гарантируя, что поток графического интерфейса выполняет работу запускаемого файла.

Даже если ваш showImage работает один раз, это не значит, что он всегда работает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...