2012-11-14 13 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:ビュー階層を作成しただけ元のスレッドは、その見解に触れることができます。 "

このターゲットをどのように達成できますか?誰もこの問題を解決するのを助けてくれますか?私はアンドロイド開発に新しいです。

ありがとう。

答えて

15

ImageViewのハンドラとランナブルを使用する必要があります。ハンドラは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

私たちは、労働者からのUIにアクセスして更新することができない、最終的には

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

       } 
      }); 

あなたは常に

0

は、以下のことを試してみてください... UIスレッド自体から、あなたの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); 

     } 
    }; 
関連する問題