一、小標題1:Handler背景
Handler最初出現在Android系統的消息機制中,它有點像是線程的攜帶型形式,負責在不同的線程之間傳遞消息以及執行相關的代碼。相比於其他線程間的通信方式(如BroadcastReceiver、Intent等),Handler具備高度可定製性、高效性以及靈活性。由於其在Android的應用開發中應用非常廣泛,所以構建一個良好的Handler機制非常重要。
Handler機制基本的工作原理是,一個Handler對象與一個線程相關聯,接收其線程的MessageQueue的消息,然後在該線程上進行處理。一個Thread對象可以對應多個Handler對象,但一個Handler對象只能與一個特定的線程綁定。當Handler對象收到一條消息時,它會先將消息封裝為一個Message對象,然後將該對象放到目標線程的MessageQueue隊列中,由目標線程依次去處理其中的每個消息。
public class Looper { static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>(); final MessageQueue mQueue; private Looper() { mQueue = new MessageQueue(); } public static void prepare() { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper()); } public static Looper myLooper() { return sThreadLocal.get(); } public static void loop() { final Looper me = myLooper(); final MessageQueue queue = me.mQueue; for (;;) { Message msg = queue.next(); // 阻塞在這等待下一個消息 msg.target.dispatchMessage(msg);// 將消息分發給目標handler處理 } } }
二、小標題2:Handler的用處
1、線程間通信。如在子線程中更新UI,可以通過Handler機制將子線程中的代碼post到UI線程執行,避免了UI更新時的問題。
2、定時器。通過Handler機制,可以實現定時器的功能,如在指定時間後執行特定任務,並實現定時重複執行的功能。
3、優化性能。Android中涉及到與用戶交互的事件,如觸摸屏事件或按鍵事件,通常是在單獨的線程中執行的,這些線程通過Handler機制通知UI線程執行相關的操作,從而提高了應用的性能。
public class ExampleActivity extends Activity { private TextView textView; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); new Thread(new Runnable() { @Override public void run() { // 處理相關任務 // 下面通過Handler機制將任務post到UI線程中更新UI handler.post(new Runnable() { @Override public void run() { textView.setText("任務處理完畢,數據已更新!"); } }); } }).start(); } }
三、小標題3:Handler的基本使用
1、在子線程中使用Handler
在子線程中使用Handler進行UI操作,需要先在UI線程中創建Handler並傳遞到子線程中,然後在子線程中使用Handler.post()方法將任務post到UI線程中。
public class ExampleActivity extends Activity { private TextView textView; private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); handler = new Handler(); // 在UI線程中創建Handler new Thread(new Runnable() { @Override public void run() { // 處理相關任務 // 下面通過Handler機制將任務post到UI線程中更新UI handler.post(new Runnable() { @Override public void run() { textView.setText("任務處理完畢,數據已更新!"); } }); } }).start(); } }
2、在UI線程中使用Handler
在UI線程中使用Handler可以直接創建Handler對象,然後直接使用Handler.post()方法進行操作。
public class ExampleActivity extends Activity { private TextView textView; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); handler.post(new Runnable() { @Override public void run() { textView.setText("數據已更新!"); } }); } }
四、小標題4:Handler的特性
1、UI線程的唯一性,即UI線程在主線程中被調用。
2、線程之間的通信,即不同的線程之間可以使用Handler發送和接收消息。
3、定時執行任務,在Handler中可以使用postDelayed()方法設置定時任務的執行時間。
4、線程安全,即在多線程環境下,Handler的執行是線程安全的。
五、小標題5:Handler的注意事項
1、Handler需要按照Android開發規範進行使用,否則會出現很多問題。
2、在使用Handler的過程中要避免內存泄漏問題,即在Activity的onDestroy()方法中將Handler對象置空。
3、Handler的執行是非同步的,需要注意數據同步的問題。
4、避免在主線程中執行耗時操作。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/311314.html