標籤:
handler是安卓中用於訊息傳遞的機制,通常用於ui線程的更新。我們知道,子線程即非UI線程是不能更新ui的,因此這個得讓handler大顯神威。
例如下面就是一個簡單的子線程的更新的ui的案例,記住:下面的案例是錯誤的
xml代碼:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context="com.example.android_handler1.MainActivity" >10 11 <TextView12 android:id="@+id/textview"13 android:layout_width="wrap_content"14 android:layout_height="wrap_content"15 android:text="@string/hello_world" />16 17 </RelativeLayout>
java代碼:
1 package com.example.android_handler1; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.TextView; 6 7 public class MainActivity extends Activity { 8 private TextView textview = null; 9 @Override10 protected void onCreate(Bundle savedInstanceState) {11 super.onCreate(savedInstanceState);12 setContentView(R.layout.activity_main);13 textview = (TextView) findViewById(R.id.textview);14 new Thread(){15 public void run() {16 try {17 Thread.sleep(1000);18 } catch (InterruptedException e) {19 // TODO Auto-generated catch block20 e.printStackTrace();21 }22 textview.setText("updata");23 };24 }.start();25 }26 27 }
當我們運行起這段代碼後,會發現程式會閃退,錯誤的原因就在於子線程去更新了ui,這時錯誤的做法。通常我們使用handler來通知主線程即ui線程來更新ui。
因此我們只需把代碼改成這樣就行:
1 package com.example.android_handler1; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.widget.TextView; 7 8 public class MainActivity extends Activity { 9 private TextView textview = null;10 private Handler handler = new Handler();11 @Override12 protected void onCreate(Bundle savedInstanceState) {13 super.onCreate(savedInstanceState);14 setContentView(R.layout.activity_main);15 textview = (TextView) findViewById(R.id.textview);16 new Thread(){17 public void run() {18 //利用handler來傳遞一個post,讓主線程來更新ui19 handler.post(new Runnable() {20 21 @Override22 public void run() {23 // TODO Auto-generated method stub24 try {25 Thread.sleep(1000);26 } catch (InterruptedException e) {27 // TODO Auto-generated catch block28 e.printStackTrace();29 }30 textview.setText("updata");31 }32 });33 34 };35 }.start();36 }37 38 }
android中handler的使用之一