Android學習筆記之Handler(一)

openkk 12年前發布 | 41K 次閱讀 Android Android開發 移動開發

Handler 為Android操作系統中的線程通信工具,包為android.os.Handler。

與Handler綁定的有兩個隊列,一個為消息隊列,另一個為線程隊列。Handler可以通過這兩個隊列來分別:

  1. 發送、接受、處理消息–消息隊列;
  2. 啟動、結束、休眠線程–線程隊列;
  3. </ol>

    Android OS中,一個進程被創建之后,主線程(可理解為當前Activity)創建一個消息隊列,這個消息隊列維護所有頂層應用對象(Activities, Broadcast receivers等)以及主線程創建的窗口。你可以在主線程中創建新的線程,這些新的線程都通過Handler與主線程進行通信。通信通過新線程調用 Handler的post()方法和sendMessage()方法實現,分別對應功能:

    1. post()  將一個線程加入線程隊列;
    2. sendMessage() 發送一個消息對象到消息隊列;

    當然,post()方法還有一些變體,比如postDelayed()、postAtTime()分別用來延遲發送、定時發送;

    消息的處理,在主線程的Handler對象中進行;具體處理過程,需要在new Handler對象時使用匿名內部類重寫Handler的handleMessage(Message msg)方法;

    從消息隊列中獲取消息。

    線程加入線程隊列可以在主線程中也可以在子線程中進行,但都要通過主線程的Handler對象調用post()。

    package mars.barhandler;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ProgressBar;
    
    public class TestBarHandler extends Activity {
        /** Called when the activity is first created. */
        //聲明控件變量
        ProgressBar bar = null;
        Button startButton = null;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //根據控件的ID得到代表控件的對象,并為按鈕設置監聽器
            bar = (ProgressBar)findViewById(R.id.bar);
            startButton = (Button)findViewById(R.id.startButton);
            startButton.setOnClickListener(new ButtonListener());
        }
        //當點擊startButton按鈕時,就會執行ButtonListener的onClick方法
        class ButtonListener implements OnClickListener{
    
            public void onClick(View v) {
                // TODO Auto-generated method stub
                bar.setVisibility(View.VISIBLE);
                updateBarHandler.post(updateThread);
            }
    
        }
        //使用匿名內部類來復寫Handler當中的handleMessage方法
        Handler updateBarHandler = new Handler(){
    
            @Override
            public void handleMessage(Message msg) {
                bar.setProgress(msg.arg1);
                Bundle bundle = msg.getData();
                updateBarHandler.post(updateThread);
                System.out.println("test---->" + bundle.getString("test"));
            }
    
        };
        //線程類,該類使用匿名內部類的方式進行聲明
        Runnable updateThread = new Runnable(){
            int i = 0 ;
            public void run() {
                System.out.println("Begin Thread" + i);
                i = i + 10 ;
                //得到一個消息對象,Message類是有Android操作系統提供
                Message msg = updateBarHandler.obtainMessage();
    
                //將msg對象的arg1參數的值設置為i,用arg1和arg2這兩個成員變量傳遞消息,優點是系統性能消耗較少
                msg.arg1 = i ;
                Bundle bundle = new Bundle();
                bundle.putString("test", "test bundle");
                msg.setData(bundle);
                try {
                    //設置當前顯示睡眠1秒
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //將msg對象加入到消息隊列當中
                if( i > 100){
                    //如果當i的值為100時,就將線程對象從handler當中移除
                    updateBarHandler.removeCallbacks(updateThread);
                    System.out.println(">>>>>>");
                }else{
                    updateBarHandler.sendMessage(msg);
                    System.out.println("<<<<<<");
                }
            }
        };
        class MyThread extends Thread{
            public void run(){
    
            }
        }
    
    }
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    
    <ProgressBar
        android:id="@+id/bar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:visibility="gone"
        />
    <Button 
        android:id="@+id/startButton"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="start"/>
    </LinearLayout>
    Android學習筆記之Handler(一)

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!