2012-11-14 14 views
6

Poniższy kod dotyczy ekranu powitalnego w mojej aplikacji. Co należy zrobić, to po załadowaniu aktywności obraz powinien być wyświetlany jako domyślny, a następnie po kilku sekundy obraz powinien zostać zmieniony na inny w tej samej czynności. Mam inny obraz podobny do pierwszego o innym kolorze. Chciałem zmienić ekran dla tego obrazu po kilku sekundach.Android - Zmień źródło widoku obrazu w czasie wykonywania po kilku sekundach

Zrobiłem to tak w moim kodzie.

package com.ruchira.busguru; 

import android.media.MediaPlayer; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Color; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 

public class SplashScreen extends Activity { 

    ImageView imgBus; 
    MediaPlayer introSound, bellSound; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.splash_screen); 
     imgBus = (ImageView) findViewById(R.id.imgBus); 
     imgBus.setImageResource(R.drawable.blackbus); 
     introSound = MediaPlayer.create(SplashScreen.this, R.raw.enginestart); 
     introSound.start(); 

       Thread timer = new Thread(){ 
      public void run(){ 
       try{ 
        sleep(3000); 
       } catch (InterruptedException e) {    
        e.printStackTrace(); 
       }finally{ 
        imgBus.setImageResource(R.drawable.bluekbus);  
       } 
      } 
     }; 
     timer.start(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.splash_screen, menu); 
     return true; 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     introSound.stop(); 
     finish(); 
    } 

    @Override 
    protected void onStop() { 
     // TODO Auto-generated method stub 
     super.onStop(); 
     introSound.stop(); 
     finish(); 
    } 
} 

ale problem jest program zatrzymuje się wykonując w wątku mówiąc ...

„android.view.ViewRoot $ CalledFromWrongThreadException: Tylko oryginalny wątek, który stworzył hierarchię widok może dotknąć jego poglądy. "

Jak mogę osiągnąć ten cel? Czy ktokolwiek pomógł mi rozwiązać ten problem. Jestem nowy w rozwoju Androida.

Dzięki.

Odpowiedz

15

Powinieneś używać Handler ImageView i Runnable. Handler to programy planujące specyficzne dla Androida i mogą działać w tym wątku. Spróbuj tego:

ImageView imgBus; 
MediaPlayer introSound, bellSound; 
Runnable swapImage = new Runnable() { 
    @Override 
    public void run() { 
     imgBus.setImageResource(R.drawable.bluekbus); 
    } 
}; 

A wewnątrz onCreate() rozmowy:

imgBus = (ImageView) findViewById(R.id.imgBus); 
imgBus.setImageResource(R.drawable.blackbus); 
imgBus.postDelayed(swapImage, 3000); // Add me! 

zrozumieć, że ekranów powitalnych są mile widziana dlatego należy skupić się na uruchomienie aplikacji tak szybko jak to możliwe (podczas ładowania wolniejszy elementu w tle). Jednak czasami niewielkie opóźnienie jest nieuniknione.

2

Zapis ten wewnątrz wreszcie

runOnUiThread(new Runnable() { 
     public void run() { 
        SplashScreen.class.img.setImageResource(R.drawable.bluekbus); 

       } 
      }); 

zawsze należy zaktualizować UI z samego wątku UI ...

0

spróbuj wykonać następujące czynności,

Nie możemy uzyskać dostęp i zaktualizować UI z pracownikiem wątki, tylko my możemy uzyskać dostęp do interfejsu użytkownika z UIThread. Jeśli potrzebujemy go zaktualizować z wątkiem tła, możemy użyć Handler'a, aby zrobić to jak w poniższym kodzie.

this.imgBus = (ImageView) findViewById(R.id.splashImageView); 
    imgBus.setImageResource(R.drawable.your_first_image); 
    this.handler = new Handler(); 
    introSound = MediaPlayer.create(SplashTestForSO.this, R.raw.enginestart); 
    introSound.start(); 

      Thread timer = new Thread(){ 
     public void run(){ 
      try{ 


       sleep(2000); 
       YourActivity.this.handler.post(runnable); 
       sleep(1000); 
      } catch (InterruptedException e) {    
       e.printStackTrace(); 
      }finally{ 

      } 
     } 
    }; 

    timer.start(); 




    this.runnable = new Runnable() { 
     public void run() { 
      //call the activity method that updates the UI 
      YourActivity.this.imgBus.setImageResource(R.drawable.your_scond_image_view); 

     } 
    }; 
Powiązane problemy