日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android中Handler消息传递机制应用之子线程不允许操作主线程的组件

發布時間:2025/3/19 Android 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中Handler消息传递机制应用之子线程不允许操作主线程的组件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

場景

進程

一個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 {@Overrideprotected 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() {@Overridepublic void onClick(View v) {//創建新線程Thread thread = new Thread(new Runnable() {@Overridepublic 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 {@Overrideprotected 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(){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);if(msg.what ==0x123){textView.setText("公眾號:霸道的程序猿");}}};button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//創建新線程Thread thread = new Thread(new Runnable() {@Overridepublic void run() {//發送空消息handler.sendEmptyMessage(0x123);//textView.setText("霸道的程序猿");}});thread.start();//開啟線程}});} }

總結:

Handler是android中提供的一個消息處理的機制。

能在任意線程中發送消息,能在主線程中獲取并處理消息。

總結

以上是生活随笔為你收集整理的Android中Handler消息传递机制应用之子线程不允许操作主线程的组件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。