2012-11-14 51 views
6

以下代碼用於我應用程序中的啓動屏幕。我需要做的是當活動加載圖像時應顯示爲默認值,然後顯示爲在相同的活動中,圖像應該變成另一個秒。我有另一個像第一個不同顏色的圖像。我想在幾秒鐘後更改該圖像的屏幕。Android - 幾秒鐘後在運行時更改圖像查看源代碼

我已經在我的代碼中這樣做了。

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

但問題是程序停止在該線程執行說法...

「android.view.ViewRoot $ CalledFromWrongThreadException:只有創建視圖層次可以觸摸其觀點原來的線程。 「

我該如何實現這個目標?有人請幫我解決這個問題。我是新的Android開發..

謝謝。

回答

15

您應該使用ImageView的Handler和Runnable。處理程序是特定於Android的調度程序,它們可以在UI線程上運行。試試這個:

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

而且裏面onCreate()電話:

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

記者瞭解到,閃屏時,因爲你應該專注於盡快啓動應用程序(在後臺加載速度較慢元素皺起眉頭)。然而,有時候輕微的延遲是不可避免的。

2

寫這裏面終於

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

       } 
      }); 

你應該總是從UI線程本身更新UI ...

0

嘗試以下,

我們不能訪問和更新來自工人的UI線程,只有我們可以從UIThread訪問UI。如果我們需要使用後臺線程來更新,那麼我們可以使用Handler來執行此操作,如下面的代碼所示。

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

     } 
    };