主要接受子線程發送的數據, 並用此數據配合主線程更新UI。html
解釋:安卓的UI線程(即OnCreate函數建立的線程)是線程非安全的。也就是說,在UI線程中,使用sleep這樣的函數會致使整個線程延遲,可是咱們在安卓開發中,每每會常常遇到一些延遲比較厲害的操做,(例如經過HTTP獲取數據信息)若是放在主線程中,則會影響UI界面的渲染。可是若是另外新開一個線程,則因爲UI線程只能在主線程中修改,而致使沒法修改主線程的UI界面。這個時候Handler就出來解決這個問題。Handler主要兩大做用:java
1. 提供post操做。post操做主要將Runnable對象放進主線程(UI)線程中的隊列中操做。post還支持延遲操做。使用post後,Runnable是按照隊列的形式逐個執行的。android
2. handlerMessage操做。主要用於新開一個線程與主線程中的通訊。新開的線程執行完畢後,能夠經過handlerMessage給主線程發送消息,而且傳遞一些參數,而後主線程就能夠修改UI界面了。安全
post類方法容許你排列一個Runnable對象到主線程隊列中:
app
post(Runnable)ide
postAtTime(Runnable,long)函數
postDelayed(Runnable long)post
sendMessage類方法, 容許你安排一個帶數據的Message對象到隊列中:動畫
sendEmptyMessage(int)spa
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
package com.example.test.com; import android.annotation.SuppressLint; 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.view.Window; import android.widget.Button; import android.widget.Toast; @SuppressLint("HandlerLeak") public class MainActivity extends Activity { private Button btn; private MyHandler myHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //實例化一個自定義的Handler myHandler = new MyHandler(); btn = (Button) findViewById(R.id.button1); //圖片點擊的時候,啓動動畫效果 btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getBaseContext(), "post start....", Toast.LENGTH_SHORT).show(); //發送一個POST操做,將Runnable加入主線程隊列 //這個是在主線程中執行,而且延遲10秒鐘延遲加載 myHandler.postDelayed(new Runnable() { @Override public void run() { btn.setText("Hello Wolrd"); //修改Button文字 } }, 10000); } }); } /** * 實現一個自定義的Handler */ public class MyHandler extends Handler { @Override public void handleMessage(Message msg) { Log.d("MyHandler", "handleMessage......"); super.handleMessage(msg); } } }
package com.example.test.com; import android.annotation.SuppressLint; 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.view.Window; import android.widget.Button; import android.widget.Toast; @SuppressLint("HandlerLeak") public class MainActivity extends Activity { private Button btn; private MyHandler myHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //實例化一個自定義的Handler myHandler = new MyHandler(); btn = (Button) findViewById(R.id.button1); //圖片點擊的時候,啓動動畫效果 btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getBaseContext(), "new Thread start....", Toast.LENGTH_SHORT).show(); //新開一個線程,若是新線程中修改UI界面,則直接程序崩潰 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(10000); //線程sleep10秒 } catch (Exception e) { } Message msg = new Message(); Bundle bundle = new Bundle(); bundle.putString("val", "Hello Handler"); msg.setData(bundle); //這邊只能記錄日誌 Log.d("sendMessageDelayed", "send"); //線程發送一個Message消息,MyHandler類中的handleMessage //會接收到數據,而且能夠更新UI myHandler.sendMessageDelayed(msg, 5000); //myHandler.sendMessage(msg); //無延遲 } }).start(); } }); } /** * 實現一個自定義的Handler */ public class MyHandler extends Handler { @Override public void handleMessage(Message msg) { //接收msg Toast.makeText(getBaseContext(), "getMessage....", Toast.LENGTH_SHORT).show(); super.handleMessage(msg); Bundle bundle = msg.getData(); //修改UI界面 btn.setText(bundle.getString("val")); } } }
公用的xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <!-- button --> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="70dp" android:layout_marginTop="116dp" android:text="Button" /> </RelativeLayout>