前言:
Android中在子執行緒中更改主執行緒中的組件是不允許的,
具體規則就是:子執行緒不允許操作主執行緒中的組件,
如果我們必須在子執行緒中更改主執行緒中的UI組件怎么辦?
所以Android 就為我們提供了handler
看下面的一個例子理解handler的:

具體代碼:
public class HandleActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tv_text;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handle);
tv_text = findViewById(R.id.tv_text);
btn = findViewById(R.id.btn);
btn.setOnClickListener(this);
}
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
if (msg.what == 0x00) {
tv_text.setText("我是第二條內容");
}
return false;
}
});
@Override
public void onClick(View v) {
//創建子執行緒
new Thread(new Runnable() {
@Override
public void run() {
handler.sendEmptyMessage(0x00);
}
}).start();
}
}
具體思路就是:在點擊按鈕時,發送一個訊息給handler,再由handler更新UI組件
總結:Handler是Android中提供的一個訊息處理的機制
- 在任意執行緒中發送訊息
- 在主執行緒中獲取并處理訊息
通過handler訊息機制,實作進度條的功能:

xml布局如下:
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="50dp"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:max="60"
/>
Activity中代碼:
public class HandleActivity extends AppCompatActivity{
private ProgressBar progress_bar;
private static final int TIME=60;//定義時間長度為60秒
private int mProgressStatus=0; //定義完成的進度
private final int TIMER_MSG=0X00; //宣告訊息代碼
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handle);
//獲取進度條組件
progress_bar = findViewById(R.id.progress_bar);
//啟動進度條
handler.sendEmptyMessage(TIMER_MSG);
}
//創建handler物件,實作1秒鐘更新一次進度
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
if (TIME-mProgressStatus>0){ //當前進度大于0
mProgressStatus++; //進度加一
progress_bar.setProgress(TIME-mProgressStatus);//更新進度
handler.sendEmptyMessageDelayed(TIMER_MSG,1000);//一秒后發送訊息
}else {
Toast.makeText(HandleActivity.this, "時間到啦,游戲結束!", Toast.LENGTH_SHORT).show();
}
return false;
}
});
}
Message語法:
- 使用Message.obtain或Handler.obtainMessage()方法獲取message
- 攜帶int型資訊,優先使用Message的arg1和arg2屬性
- 使用Message.what來標記資訊
Message物件的屬性有:
- arg1,arg2整型
- obj Object型別
- replyTo 發送到何處
- what自定義的訊息代碼
Looper物件的創建:
handler在主執行緒中 是系統自動創建Looper物件
如果在子執行緒中創建Handler物件,則要先手動創建Looper物件,
代碼如下:
public class LooperActivity extends AppCompatActivity {
private static final String TAG = "LooperActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_looper);
new Thread(new Runnable() {
@Override
public void run() {
//初始化Looper物件
Looper.prepare();
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
Log.e(TAG, "handleMessage: " + String.valueOf(msg.what));
return false;
}
});
Message message = handler.obtainMessage(); //獲取Message
message.what = 0x4; //設定訊息代碼
handler.sendMessage(message);
//啟動looper
Looper.loop();
}
}).start();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/290310.html
標籤:其他
