Handler小结
程序员文章站
2022-07-14 17:04:30
...
1.为什么要用Handler
在Android中里有一句主线程中不能进行耗时操作,所以进行耗时操作一般开启子线程,在Android中子线程不能更新UI线程(主线程),所以需要一个子线程与主线程通讯的工具,即Handler类。
2.什么是Handler
Handler即线程通讯的工具,可以进行更新ui和处理消息。
3.什么是Looper
1、Looper可以让一个线程具有循环工作的特性,也就说可以把线程编程Looper线程。
2、每个线程只能也最多有一个Looper对象,这个Looper对象是一个Thredlocal,可以保证当前线程操作的Looper对象一定是当前线程自己的。
3、Looper内部有一个MQ,调用loop()方法后线程开始不断的从MQ中去消息交给后面的Handler处理。
4.什么是MessageQueue
消息队列就是一个数据的容器,并且可以异步处理数据,提高数据的并发性。比如审核文章:在同一时间,可以接受大量的文章(数据)。但是审核的人是一份一份看然后通过审核。
5.Handler怎么用
用一个简单的例子来展示,代码如下:
package com.example.demo5;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class DemoActivity extends AppCompatActivity implements View.OnClickListener {
private TextView demo_tv;
private Button demo_btn;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
demo_tv.setText("测试完成");
//修改ui
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
demo_btn=findViewById(R.id.demo_btn);
demo_tv=findViewById(R.id.demo_tv);
demo_btn.setOnClickListener(this);
}
//点击按钮开始线程
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.demo_btn:
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(1);
//传递一个int值,执行handleMessage方法
}
}).start();
break;
default:
break;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".DownloadActivity">
<TextView
android:id="@+id/demo_tv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="测试中"
tools:ignore="InvalidId" />
<Button
android:id="@+id/demo_btn"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="开始测试"/>
</LinearLayout>
6.案列解析———倒计时Demo
先附上代码
package com.example.demo5;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class DemoActivity extends AppCompatActivity implements View.OnClickListener {
private TextView demo_tv;
private Button demo_btn;
private EditText demo_et;
private int i=0;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle= msg.getData();
if (msg.what==0){
//做一个终止标记
demo_tv.setText(""+msg.obj);
}else {
//输出i
demo_tv.setText(""+msg.what);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
demo_btn=findViewById(R.id.demo_btn);
demo_tv=findViewById(R.id.demo_tv);
demo_et=findViewById(R.id.demo_et);
demo_btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//获取输入的值
if(demo_et!=null){
String str=demo_et.getText().toString();
if(str!=null&&str.length()>0){
i=Integer.parseInt(str);
}
}
switch (v.getId()){
case R.id.demo_btn:
new Thread(new Runnable() {
@Override
public void run() {
//开启循环,每过一秒减一,并且提交i
for(;i>=0;i--){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(i);
}
Message msg =handler.obtainMessage();
msg.obj="倒计时完成";
handler.sendMessage(msg);
//提交消息
}
}).start();
}
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".DownloadActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal">
<TextView
android:layout_width="50dp"
android:layout_height="30dp"
android:text="倒计时"/>
<EditText
android:id="@+id/demo_et"
android:layout_width="60dp"
android:layout_height="40dp"
android:gravity="bottom"
android:inputType="number"
/>
<TextView
android:layout_width="50dp"
android:layout_height="30dp"
android:text="秒"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:layout_weight="1">
<TextView
android:id="@+id/demo_tv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="40sp"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<Button
android:id="@+id/demo_btn"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_centerHorizontal="true"
android:text="倒计时开始"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>