2012-11-14 33 views
6

Mã sau đây dành cho màn hình giật gân trong ứng dụng của tôi.Điều tôi cần làm là khi hoạt động tải hình ảnh sẽ được hiển thị làm mặc định và sau đó sau vài giây hình ảnh phải được thay đổi thành hình ảnh khác trong cùng một hoạt động. Tôi có một hình ảnh khác như hình ảnh đầu tiên với màu sắc khác nhau. Tôi muốn thay đổi màn hình cho hình ảnh đó sau vài giây.Android - Thay đổi Nguồn Chế độ xem Hình ảnh tại thời gian chạy sau vài giây

Tôi đã thực hiện nó như thế này trong mã của tôi.

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

nhưng vấn đề là chương trình dừng lại bằng cách thực hiện trong các chủ đề nói ...

"android.view.ViewRoot $ CalledFromWrongThreadException: Chỉ có chủ đề ban đầu đã tạo ra phân cấp hình ảnh có thể chạm vào quan điểm của mình. "

Làm cách nào tôi có thể đạt được mục tiêu này? Có ai vui lòng giúp tôi phân loại vấn đề này không. Tôi mới phát triển Android ..

Cảm ơn.

Trả lời

15

Bạn nên sử dụng Trình xử lý của ImageView và Runnable. Trình xử lý là các bộ lập lịch cụ thể cho Android và chúng có thể chạy trên chuỗi giao diện người dùng. Hãy thử điều này:

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

Và bên onCreate() gọi:

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

Hiểu rằng màn hình splash được tán thành bởi vì bạn nên tập trung vào bắt đầu ứng dụng càng sớm càng tốt (trong khi tải các yếu tố chậm hơn ở chế độ nền). Tuy nhiên đôi khi một chút chậm trễ là không thể tránh khỏi.

2

Viết bên này cuối cùng

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

       } 
      }); 

Bạn nên thường xuyên cập nhật giao diện người dùng của bạn từ giao diện người dùng thân Chủ đề ...

0

Hãy thử những điều sau đây,

Chúng tôi không thể truy cập và cập nhật giao diện người dùng từ nhân viên chủ đề, chỉ chúng tôi mới có thể truy cập giao diện người dùng từ UIThread. Nếu chúng ta cần nó để cập nhật với chủ đề nền thì chúng ta có thể sử dụng Handler để làm điều này giống như trong đoạn mã sau.

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

     } 
    }; 
Các vấn đề liên quan