android的多線程編程

       多線程編程在編程中占有很大的地位,android手機的多核時代的到來,為瞭提高資源的利用率,多線程的學習是必須的,一般會用的Handler類,下面是handler的一些介紹。

Handler的特點

1. 傳遞Message。用於接受子線程發送的數據, 並用此數據配合主線程更新UI。

          在Android中,對於UI的操作通常需要放在主線程中進行操作。如果在子線程中有關於UI的操作,那麼就需要把數據消息作為一個Message對象發送到消息隊列中,然後,有Handler中的handlerMessage方法處理傳過來的數據信息,並操作UI。當然,Handler對象是在主線程中初始化的,以為它需要綁定在主線程的消息隊列中。

類sendMessage(Message msg)方法實現發送消息的操作。 在初始化Handler對象時重寫的handleMessage方法來接收Messgae並進行相關操作。

2. 傳遞Runnable對象。用於通過Handler綁定的消息隊列,安排不同操作的執行順序。

         Handler對象在進行初始化的時候,會默認的自動綁定消息隊列。利用類post方法,可以將Runnable對象發送到消息隊列中,按照隊列的機制按順序執行不同的Runnable對象中的run方法。

Handler中分發消息的一些方法

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

Handler和多線程

           post方法雖然發送的是一個實現瞭Runnable接口的類對象,但是它並非創建瞭一個新線程,而是執行瞭該對象中的run方法。也就是說,整個run中的操作和主線程處於同一個線程。

            這樣對於那些簡單的操作,似乎並不會影響。但是對於耗時較長的操作,當它被加入到消息隊列中之後執行會占用很長的時間,以至於處於同一線程的其他操作無法繼續執行,就會出現“假死”。為瞭解決這個問題,就需要使得handler綁定到一個新開啟線程的消息隊列上,在這個處於另外線程的上的消息隊列中處理傳過來的Runnable對象和消息。

            這樣,當使用sendMessage方法傳遞消息或者使用post方法傳遞Runnable對象時,就會把它們傳遞到與handler對象綁定的處於另外一個線程的消息隊列中,它們將在另外的消息隊列中被處理。而主線程還會在發送操作完成時候繼續進行,不會影響當前的操作。

            這裡需要註意,這裡用到的多線程並非由Runnable對象開啟的,而是ThreadHandler對象開啟的。Runnable對象隻是作為一個封裝瞭操作的對象被傳遞,並未產生新線程。

handler的小例子

佈局很簡單就一個Textview主要是間隔一秒更新一下

[html]  

<TextView  

    android:id="@+id/handlertest"  

    android:layout_width="fill_parent"  

    android:layout_height="wrap_content"  

    android:text="@string/hello" />  

 

實現的方法如下:

[java]  

package com.nyist.wj;  

  

import android.app.Activity;  

import android.os.Bundle;  

import android.os.Handler;  

import android.os.HandlerThread;  

import android.os.Message;  

import android.widget.TextView;  

  

public class HandlerActivity extends Activity {  

    TextView handlertest;  

    Handler handler = new Handler() {  

  

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

  

            switch (msg.what) {  

            case 0:  

                Bundle bundle = msg.getData();  

                String str = bundle.getString("msg");  

                handlertest.setText(str);  

  

                break;  

  

            default:  

                break;  

            }  

        };  

    };  

  

    /** Called when the activity is first created. */  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

        handlertest = (TextView) findViewById(R.id.handlertest);  

          

        new myThread(this).start();  

  

    }  

      

    public class myThread extends Thread {  

        int count;  

        HandlerActivity handlerActivity;  

        boolean flag = true;  

  

        public myThread(HandlerActivity handlerActivity) {  

  

            this.handlerActivity = handlerActivity;  

  

        }  

  

        public void run() {  

            while (flag) {  

if (count >= 20) {  

                    flag = false;  

                }  

                String message = "第" + (count++) + "次測試";  

                Bundle bundle = new Bundle();  

                bundle.putString("msg", message);  

                Message testMessage = new Message();  

                testMessage.setData(bundle);  

                testMessage.what = 0;  

                handlerActivity.handler.sendMessage(testMessage);  

                try {  

                    Thread.sleep(1000);  

                } catch (Exception e) {  

  

                }  

            }  

        }  

  

    }  

  

}  

 

實現的結果如圖:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *