Android学习(9)Handler_异步回调机制(使用Handler更新ProgressBar)
Handler机制:
Handler机制即异步回调机制,也可以理解为线程间的消息机制,可以用Handler实现线程间的通信,也可以用Handler实现多线程应用
1.布局文件,布局一个ProgressBar和两个Button,点击按钮开始和停止
activity_handler.xml
<?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="com.example.test.androidtest.HandlerActivity">
<ProgressBar
android:id="@+id/pbHd"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btnAddHd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始Handler"/>
<Button
android:id="@+id/btnDecHd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="停止Handler"/>
</LinearLayout>
2.在Activity中创建Handler和线程,实现ProgressBar自动增长
public class HandlerActivity extends AppCompatActivity implements View.OnClickListener{
private Button add,dec;
private ProgressBar pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
add = (Button)findViewById(R.id.btnAddHd);
dec = (Button)findViewById(R.id.btnDecHd);
pb = (ProgressBar)findViewById(R.id.pbHd);
add.setOnClickListener(this);
dec.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnAddHd:
//通过POST方法启动runnable
handler.post(runnable);
break;
case R.id.btnDecHd:
//移除掉runnable
handler.removeCallbacks(runnable);
break;
}
}
//创建Handler
Handler handler = new Handler(){
//接收消息的方法
public void handleMessage(Message msg) {
//把进度条的值设置为消息队列传过来的值:arg1
pb.setProgress(msg.arg1);
System.out.println("getMessage="+msg.arg1);
//每增加一次,就再执行一次发送消息的线程
handler.post(runnable);、
//如果进度条值为100,就停止线程
if (msg.arg1 == 100){
handler.removeCallbacks(runnable);
}
};
};
//实例化一个Runnable线程
Runnable runnable = new Runnable() {
int i = 0;
@Override
public void run() {
//每次增长10
i += 10;
//Message是Android系统所提供的(消息对象)
Message message = handler.obtainMessage();
//arg1的优点:它是系统提供的,并且会节省系统资源的消耗
message.arg1 = i;
System.out.println(i);
try{
//每一秒执行一次
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
//消息队列,向handler发送消息
handler.sendMessage(message);
}
};
}
声明:
1.知识点来源于《网易云课堂》——《Android基础视频教程》
2.本文只用于本人自身学习记录,如有侵权,请立即通知本人更改或删除