場景
行程:
一個Android應用就是一個一個行程,每個應用在各自的行程中運行,
執行緒:
比行程更小的獨立運行的基本單位,一個行程可以包含多個執行緒,
要求:
一個TextView和一個Button,點擊Button后新開一個執行緒更改TextView的內容,
修改activity_main.xml,在頁面添加一個TextView和一個Button,然后分別設定其id屬性,
然后在MainActivity中獲取Button按鈕,然后在Button的點擊事件中修改TextView的內容,
如果只通過以下代碼是否能實作
package com.badao.handlertest; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView textView = findViewById(R.id.text1); Button button = findViewById(R.id.button2); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //創建新執行緒 Thread thread = new Thread(new Runnable() { @Override public void run() { textView.setText("霸道的程式猿"); } }); thread.start();//開啟執行緒 } }); } }
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程式猿
獲取編程相關電子書、教程推送與免費下載,
實作
運行APP后,點擊按鈕會發現程式停止運行

然后查看輸出例外:Only the original thread that created a view hierarchy can touch its views.

這句話的意思就是不能在子執行緒中更新主執行緒,
文本框就是主執行緒的,而按鈕就是子執行緒的,子執行緒不能更新主執行緒的組件,
為此,安卓提供了Handler,我們可以在單擊這個按鈕的時候發送通知給handler,然后由handler更改這個文本框,
首先使用匿名內部類新建一個handler,然后重寫其handleMessage方法,然后再按鈕的點擊事件中,呼叫handler物件的發送空訊息的方法,發動一個int型變數,然后在上面的handleMessage方法中進行判斷,如果與發送時設定的一樣則重新改變TextView的值,
代碼修改為:
package com.badao.handlertest; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView textView = findViewById(R.id.text1); Button button = findViewById(R.id.button2); final Handler handler = new Handler(){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); if(msg.what ==0x123){ textView.setText("公眾號:霸道的程式猿"); } } }; button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //創建新執行緒 Thread thread = new Thread(new Runnable() { @Override public void run() { //發送空訊息 handler.sendEmptyMessage(0x123); //textView.setText("霸道的程式猿"); } }); thread.start();//開啟執行緒 } }); } }
總結:
Handler是android中提供的一個訊息處理的機制,
能在任意執行緒中發送訊息,能在主執行緒中獲取并處理訊息,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/25165.html
標籤:Android
