.Net程式員玩轉Android開發---(17)Handler用法
在android開發中,如果在一個線程中想更新主介面中控制項顯示的資料,直接給主介面控制項賦值就會出現異常,android中為了安全起見,是不允許線上程中更新介面控制項的資料,遇到這種情況,我們可以使用Handler. Handler就是處理介面和線程間的訊息傳遞,通訊的組件。下面我們示範下handler處理詳細的兩種辦法,下面的這個列子通過點擊不同按鈕展現handler.post和handler.sendmsg兩個傳遞訊息的方法。
1. Handler.Post
建立一個handler對象和Runnable對象,通過handler.post(new Runnable(){});處理來更新介面中的textview的資料
2.Handler.sendMessage
這個例子中,我們建立一個employee員工類,單擊按鈕的時候,顯示員工的資訊,通過handler.sendmessage來傳遞訊息和參數進行處理
package com.example.helloword;import android.R.string;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.SimpleAdapter;import android.widget.TextView;public class HandlerActivity extends Activity {private TextView tv;private Button btnpost;private Button btnmsg;private Handler handler=new Handler();//post處理handler//sendmsg處理handlerprivate Handler handlerTwo=new Handler(){public void handleMessage(Message msg) {switch (msg.what) {case 0:tv.setText(姓名:+((employee)msg.obj).name);break;}}};protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.handlerlayout);tv=(TextView)findViewById(R.id.textViewMsg);btnpost=(Button)findViewById(R.id.btnpost);btnmsg=(Button)findViewById(R.id.btnmsg);btnpost.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubThread thread=new Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubhandler.post(runOne);}});thread.start();}});btnmsg.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubThread thread=new Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubMessage msg=new Message();msg.arg1=1;employee employeeone=new employee();employeeone.name=員工1;employeeone.age=20;msg.obj=employeeone;msg.what=0;handlerTwo.sendMessage(msg);}});thread.start();}});} Runnable runOne=new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubtv.setText(正在執行handler post);} }; public class employee { public String name; public int age; }}
??