2010-11-17 2 views
1

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

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. Это не обязательно знать о моей проблеме. Вначале itdidn't work, logcat сказал, что я не мог дотронуться до представления на представлении heirarchy, которое не было создано в этой теме. Я не был уверен, что это значит, поэтому я сделал

image.post(...) 

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

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

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

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

ответ

1

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

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

+0

Спасибо за ответ. Хорошо, но почему showPicture работал один раз без post()? Кроме того, должен ли я никогда не определять внутренний поток класса для приложения GUI? – 2010-11-17 16:01:08

+0

@JJG, хорошо что показываетImage do (код)? – dacwe

Смежные вопросы