Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中關於Handler的若干思考

Android中關於Handler的若干思考

編輯:關於Android編程

今天再把Handler的知識回顧總結一下。       本文包括與Handler有關的以下問題:     (1)Handler的作用     (2)為什麼Android中要設計為只能在UI線程中去更新UI呢?     (3)Handler的兩個異常     (4)Handler、Looper MessageQueue之間的關系(源碼角度)     (5)跟線程相關的Handler,即HandlerThread(源碼角度分析)     (6)主線程往子線程發消息       一、Handler的作用:   (1)在非UI線程中完成耗時操作,在UI線程中去更新UI。   (2)可以在主線程中發送延時消息。       二、為什麼Android中要設計為只能在UI線程中去更新UI呢?   (1)解決多線程並發問題(根本原因)   (2)提高界面更新的性能問題   (3)架構設計的簡單   你可能會說,既然是擔心多線程並發問題,那我在子線程中加鎖進行更新UI行不行呢?你這樣想的話,會容易造成UI卡頓的。   注1:大部分面試者很難去說出一個令面試官滿意的答案。   注2:關於多線程,這裡舉一個例子,比如說銀行取款的問題。正常情況下,銀行卡余額不能少於取款金額,如果多線程進行取款的話,就會造成線程不安全。   注3:Android中之所以說架構簡單,是因為幫我們封裝了很多更新UI的操作。       三、Handler的兩個異常:   在使用Handler時,經常會出現以下兩個異常:   (1)CalledFromWrongThreadException:這種異常是因為嘗試在子線程中去更新UI,進而產生異常。   (2)Can't create handle inside thread that ha not called Looper.prepared:是因為我們在子線程中去創建Handler,而產生的異常。   我們接下來通過代碼來把這兩個異常演示一下。   1、子線程中更新UI的異常:   (1)activity_main.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"
                tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"/>

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="按鈕"/>

</RelativeLayout>

 

   上方代碼中,一個文本,一個按鈕,代碼比較簡單。   (2)MainActivity.java:    
 1 import android.app.Activity;
 2 import android.os.Bundle;
 3 import android.view.View;
 4 import android.widget.Button;
 5 import android.widget.TextView;
 6 
 7 public class MainActivity extends Activity {
 8 
 9     private TextView tv;
10     private Button btn;
11 
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16         tv = (TextView) findViewById(R.id.tv);
17         btn = (Button) findViewById(R.id.btn);
18 
19         //點擊按鈕後,嘗試在子線程中更新UI
20         btn.setOnClickListener(new View.OnClickListener() {
21             @Override
22             public void onClick(View v) {
23 
24                 new Thread(new Runnable() {
25                     @Override
26                     public void run() {
27                         tv.setText("smyhvae");  //子線程中更新UI
28                     }
29                 }).start();
30 
31             }
32         });
33     }
34 }

 

    上方代碼中,核心代碼是第27行:點擊按鈕後,在子線程中更新UI。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved