標籤:
【轉】http://blog.csdn.net/lanpy88/article/details/6659630
一Handler的定義:
主要接受子線程發送的資料, 並用此資料配合主線程更新UI.
解釋: 當應用程式啟動時,Android首先會開啟一個主線程 (也就是UI線程) , 主線程為管理介面中的UI控制項,進行事件分發, 比如說, 你要是點擊一個 Button, Android會分發事件到Button上,來響應你的操作。 如果此時需要一個耗時的操作,例如: 連網讀取資料,或者讀取本地較大的一個檔案的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,介面會出現假死現象, 如果5秒鐘還沒有完成的話,會收到Android系統的一個錯誤提示 "強制關閉". 這個時候我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險的. 這個時候,Handler就出現了來解決這個複雜的問題,由於Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞資料,這個時候,Handler就承擔著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(裡麵包含資料) , 把這些訊息放入主線程隊列中,配合主線程進行更新UI。
二使用過程:
1定義Handler對象並初始化,重寫handleMessage()函數
2定義Thread線程對象,通常寫成一個類形式(如class ThreadTest implements Runnable),在run()方法中操作資料,並把資料handler.sendMessage()方法傳輸 到handler對象中,並開啟線程。(注意:該步驟不一定用Thread實現,也可以利用TimeTask實現,具體的操作同樣放在run()方法中)
3在handleMessage()函數中根據不同的資料形式實現不同的方法。
執行個體:
import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainAcitivity extends Activity { /** Called when the activity is first created. */ private Handler handler=new Handler(){ public void handleMessage(Message msg){ switch (msg.arg1) { case 1: txtTextView.setText("bbbb"); break; case 2: setTitle("aaa"); default: break; } } }; private Button btn; private TextView txtTextView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtTextView=(TextView)findViewById(R.id.txtView); btn=(Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { ThreadTest threadTest=new ThreadTest(); new Thread(threadTest).start(); ThreadTest2 threadTest2=new ThreadTest2(); new Thread(threadTest2).start(); } }); } private class ThreadTest implements Runnable{ public void run() { // TODO Auto-generated method stub try{ Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } Message msgMessage=new Message(); msgMessage.arg1=1; handler.sendMessage(msgMessage); Log.e("ThreadName", Thread.currentThread().getName()); } } private class ThreadTest2 implements Runnable{ public void run() { // TODO Auto-generated method stub try{ Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } Message msgMessage=new Message(); msgMessage.arg1=2; handler.sendMessage(msgMessage); Log.e("ThreadName", Thread.currentThread().getName()); } }}
簡易版:定義了一個button,點擊button非同步實現,更換button的text
package com.example.handlertest;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity { private Button start; //定義handler,根據接收到不同的訊息來進行不同的ui更新操作 private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { //這裡放更新ui線程的代碼 switch (msg.arg1) { case 0: start.setText("Merry Christmas :)"); break; default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); start = (Button)findViewById(R.id.start); start.setOnClickListener(new handleOnclickListener()); } private class handleOnclickListener implements View.OnClickListener{ @Override public void onClick(View arg0) { // TODO Auto-generated method stub //開啟一個新的線程 ThreadTest threadTest = new ThreadTest(); threadTest.start(); } }; private class ThreadTest extends Thread { public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //進行耗時操作,發送handler訊息 Message msgToSend = new Message(); msgToSend.arg1 = 0; handler.sendMessage(msgToSend); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }}
安卓handler、thread實現非同步任務