Android應用開發基礎篇(5)—–Handler與多線程

來源:互聯網
上載者:User

一、概述

       Handler這個類主要用來發送和處理訊息的。它有多個發送訊息函數,但只有一個處理訊息函數handleMessage()。


二、要求

       程式中有兩個線程,一個是UI線程,一個是自己建立的線程,在自己建立的線程中發送訊息,在UI線程中接收並處理這個訊息。

 

三、實現

       不僅是Android,很多其他介面編程都是不允許在其他線程中直接更新UI介面的。因此可以在其他線程中向UI線程發送一些需要更新介面的訊息,讓UI線程來更新介面。

       建立工程MyHandler,修改/res/layout/main.xml布局檔案,在裡面添加2個Button按鈕,1個空的View(主要是作排版用的)和1個文本TextView。完整的main.xml檔案如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <Button
8 android:id="@+id/mbutton"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:text="啟動線程"
12 android:textSize="15px"
13 />
14
15 <Button
16 android:id="@+id/sbutton"
17 android:layout_width="fill_parent"
18 android:layout_height="wrap_content"
19 android:text="停止線程"
20 android:textSize="15px"
21 />
22
23 <View
24 android:layout_width="fill_parent"
25 android:layout_height="70px"
26 />
27
28 <TextView
29 android:id="@+id/mtextview"
30 android:layout_width="fill_parent"
31 android:layout_height="wrap_content"
32 android:text=" "
33 android:textColor="#FF0000"
34 android:textSize="50px"
35 android:gravity="center_horizontal"
36 />
37
38 </LinearLayout>

接著修改MyHandlerActivity.java檔案,該檔案中定義了2個類,1個是mHandler類,繼承自Handler類,實現了handleMessage (Message msg)函數。另一個是mThread類,繼承自Thread類,實現了run()函數。其他那些在程式中都有詳細注釋,完整的MyHandlerActivity.java檔案如下:

  1 package com.nan.handler;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.os.Handler;
6 import android.os.Message;
7 import android.view.View;
8 import android.widget.Button;
9 import android.widget.TextView;
10
11 public class MyHandlerActivity extends Activity
12 {
13 //線程是否停止標誌位
14 private boolean STOP = true;
15 //線程已經啟動了幾秒
16 private int second = 0;
17
18 private mHandler handler;
19 private mThread thread;
20 private Button mButton;
21 private Button sButton;
22 private TextView mTextView;
23
24 /** Called when the activity is first created. */
25 @Override
26 public void onCreate(Bundle savedInstanceState)
27 {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.main);
30
31 handler = new mHandler();
32 thread = new mThread();
33
34 mTextView = (TextView)findViewById(R.id.mtextview);
35 mButton = (Button)findViewById(R.id.mbutton);
36 //設定“啟動線程”按鈕事件處理
37 mButton.setOnClickListener(new View.OnClickListener()
38 {
39
40 @Override
41 public void onClick(View v)
42 {
43 // TODO Auto-generated method stub
44 //設定標誌位
45 STOP = false;
46 //開啟新的線程
47 thread.start();
48
49 }
50 });
51 sButton = (Button)findViewById(R.id.sbutton);
52 //設定“停止線程”按鈕事件處理
53 sButton.setOnClickListener(new View.OnClickListener()
54 {
55
56 @Override
57 public void onClick(View v)
58 {
59 // TODO Auto-generated method stub
60 //設定標誌位
61 STOP = true;
62 }
63 });
64
65 }
66
67 //自己定義的Handler類
68 private class mHandler extends Handler
69 {
70 @Override
71 public void handleMessage (Message msg)
72 {
73 switch(msg.what)
74 {
75 case 1:
76 {
77 //秒數增加
78 second ++;
79 //顯示是第幾秒
80 mTextView.setText(Integer.toString(second));
81 break;
82 }
83 }
84 }
85 }
86
87 //自己定義的Thread類
88 private class mThread extends Thread
89 {
90
91 @Override
92 //線程啟動時執行這個函數
93 public void run()
94 {
95 //一直迴圈,直到標誌位為“真”
96 while(!STOP)
97 {
98 try {
99 //延時1秒
100 Thread.sleep(1000);
101 } catch (InterruptedException e) {
102 // TODO Auto-generated catch block
103 e.printStackTrace();
104 }
105 Message msg = new Message();
106 //訊息標誌
107 msg.what = 1;
108 //發送這個訊息
109 handler.sendMessage(msg);
110 }
111 }
112 }
113
114 }

好了,運行該程式。

點擊一下“開啟線程”按鈕,如下:

再點擊一下“停止線程”按鈕,發現計數停止了,說明新開啟的線程已經退出了。

完成。

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: