如何理解Handler机制
程序员文章站
2022-05-14 17:53:49
...
当用户启动一个activity之后,就是开始启动了主线程,主线程一旦开始启动,配套的就产生一个消息队列和一个取队列里面的消息的一个循环函数,循环函数里放着HandlerManager()方法,主线程负责处理循环队列里的消息和负责界面的刷新(也只有主函数才能负责界面的刷新,而子线程不能),
但是一旦主线程出现无法处理队列里的某个消息的时候就开始启动子线程,主线程启动子线程来帮主线程处理主线程无法处理的消息(一个主线程可以启动多个子线程),当主线程利用子线程来处理消息的时候就会产生一个Handler对象,对象里面放着处理消息的方法,
当子线程处理好消息之后,返回的数据就放在Handler对象的方法里面,(这个Handler对象里的方法是我们开发人员可以自己定义的!我们需要哪些方法我们就自己写),我们思考一下,这个子线程和主线程是如何相互联系起来的呢?换句话说,子线程处理好的消息返回的数据是如何再回到主线程的消息队列呢?其实就是通过主线程产生的那个Handler对象,传递消息Message!
当子线程把处理好消息的返回数据再次放回到主线程的队列之后,主线程的取消息循环函数把这个消息取出来,进行函数的回调,就可以完成界面最后的成功刷新了!
下面是流程图:(可能有点乱,,)
代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_progress"
android:text="加载进度条"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<ProgressBar
android:id="@+id/progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="40dp"/>
</LinearLayout>
package cn.com.handlertest2;
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.ProgressBar;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btn_progress;
private ProgressBar progressBar;
private UpdateProgressHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_progress = (Button) findViewById(R.id.btn_progress);
progressBar = (ProgressBar) findViewById(R.id.progress);
handler = new UpdateProgressHandler();
btn_progress.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UpdateProgressThread thread=new UpdateProgressThread(handler);
thread.start();
}
});
}
class UpdateProgressHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 0001:
Toast.makeText(MainActivity.this,"开始更新进度条",Toast.LENGTH_SHORT).show();
break;
case 0002:
progressBar.setProgress(msg.arg1);
break;
case 0003:
Toast.makeText(MainActivity.this,"更新进度条结束",Toast.LENGTH_SHORT).show();
break;
}
}
}
class UpdateProgressThread extends Thread{
Handler handler=null;
public UpdateProgressThread(Handler h){
handler=h;
}
@Override
public void run() {
//发送开始时的消息
handler.sendEmptyMessage(0001);
//使用for循环来模拟进度条的进度.
for (int i = 0;i < 100; i ++){
//更新进度条
Message msg=handler.obtainMessage(0002,i,0);
handler.sendMessage(msg);
try {
//通过线程休眠模拟耗时操作
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//发送结束时的消息
handler.sendEmptyMessage(0003);
}
}
}