Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之十七 進度條和Hanlder

Android之十七 進度條和Hanlder

編輯:關於Android編程

構建進度條

在XML布局文件中使用ProgressBar標簽布局視圖

android:id="@+id/progressbar"

android:layout_width="match_parent"

android:layout_height="wrap_content"

style="@android:style/Widget.ProgressBar.Horizontal"

/>

在Java代碼中使用android.widget.ProgressBar類操作視圖

ProgressBar bar = (ProgressBar)findViewById(R.id.progressbar);

//設定進度條的取值范圍0~n

bar.setMax(10);


在XML布局文件中使用SeekBar標簽布局視圖

android:id="@+id/seekbar"

android:layout_width="match_parent"

android:layout_height="wrap_content"

/>

 

在Java代碼中使用android.widget.SeekBar類操作視圖

SeekBar seekBar = (SeekBar)findViewById(R.id.seekbar);

seekBar.setMax(10);

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()

{

@Override

public void onProgressChanged(SeekBar seekBar, int progress,

boolean fromUser) {

//這裡填寫處理事件的代碼

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {}

@Override

public void onStopTrackingTouch(SeekBar seekBar) {}

});

構建評分視圖

XML布局文件中使用RatingBar標簽

android:id="@+id/ratingbar"

android:layout_width=“wrap_content"

android:layout_height="wrap_content” />


事件監聽接口為android.widget.RatingBar.OnRatingBarChangeListener,Java代碼中使用android.widget.RatingBar類

.RatingBar bar = (RatingBar)findViewById(R.id.ratingbar);

//設定評分視圖顯示的星的顆數

bar.setNumStars(5);

bar.setMax(10);

 

Handler簡介

Handler相關知識介紹
Android應用的主線程,在應用程序啟動時,Android會啟動一條負責界面事件處理的主線程,當界面事件需要處理很長時間時,應該將任務放在一個子線程中運行
子線程不應該修改界面,因為主線程在負責,如果修改則線程不安全,Handler為解決子線程與主線程通訊而設立,在主線程運行時創建Handler對象
Handler對象將自動綁定到主線程中,主線程將會在消息循環過程中不停處理Handler中的數據處理需求,Handler提供了多種方法用於給子線程提供傳遞數據的方法:
post()、postAtTime()、postDelay()
sendMessage()、sendMessageAtTime()、sendMessageDelay()


實現淘寶自動播放動畫步驟:
1.將要播放的動畫復制到drawable目錄
2.在布局文件中添加一個ImageView用於顯示圖片
3.在主線程中創建Handler處理圖片更換動作
4.創建Timer(Timer自身就會啟動一個子線程)定時發送消息

主視圖Activity,圖片資源代碼如下:

//ImageView對象,用於顯示圖片

private ImageView image;

//定義數組,存儲圖片資源

private int[] images = {

R.drawable.image1,

R.drawable.image2,

R.drawable.image3,

R.drawable.image4,

R.drawable.image5,

};

int index = 0;//圖片資源索引


定義Handler代碼如下:

Handler handler = new Handler(){

//處理消息

@Override

public void handleMessage(Message msg) {

//如果是該線程發送的消息

if(msg.what==1)

{

//動態修改圖片

image.setImageResource(images[index++%images.length]);

}

super.handleMessage(msg);

}

};

 


主視圖Activity,onCreate()方法代碼如下:

protected void onCreate(android.os.Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.handlertest);

image = (ImageView) findViewById(R.id.image);

//創建周期2秒的計時器,並創建執行任務

new Timer().schedule(new TimerTask() {

@Override

public void run() {

//發送一個what為1的空消息

handler.sendEmptyMessage(1);

}

},0,2000);

}


總結

上面代碼中,Timer用於周期性執行指定任務,Timer對象可調度TimerTask對 象,TimerTask對象的本質就是啟動一條新的線程,由於Android不允許其他線程修改Activity裡的UI界面(因為不安全),因此新線程 只能發送一條消息,通知主線程更新界面。
Handler的作用就是建立主線程和子線程之間的紐帶,子線程通過Handler對象發送消息,並回傳給Handler,這樣主線程就可以通過Handler處理消息了。

Handler機制原理解析

Handler工作中需要使用到以下組件:
Message:Handler接受和處理的消息對象
Looper:不斷(死循環)讀取MessageQueue中的Message對象,如果讀到Message就將Message傳遞給發送該消息的Handler進行處理。每個線程只有一個Looper對象
MessageQueue:消息隊列,以先進先出的方式管理Message對象,程序創建Looper對象時會在其構造器中創建MessageQueue對象

Handler的作用主要有兩個:
1.在新啟動的線程(子線程)中發送消息
2.在主線程中獲取、處理消息
子 線程使用Handler發送消息(Message),被發送的消息必須被送到指定的消息隊列(MessageQueue,由Looper管 理,Looper由子線程自己創建);主線程通過系統創建的Looper對象的looper()方法使用一個死循環不斷取出MessageQueue中的 消息,並交由Handler處理,進而實現主線程中視圖的改變

通過Handler消息傳遞機制修改Activity中文本信息

//創建Handler

Handler handler = new Handler(){

//處理消息

public void handleMessage(android.os.Message msg) {

if(msg.what==1)

{

txt.setText("update handler");

}

};

};

/啟動新線程發送消息
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);//線程沉睡3秒
handler.sendEmptyMessage(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved