Android中ProgressBar的使用-通过Handler与Message实现进度条显示
场景
进度条效果

注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
将布局改为相对布局,然后添加一个ProgressBar,并添加id属性。
然后通过
android:max=""
设置进度条最大值
通过
android:layout_alignParentBottom="true"
android:layout_marginBottom="50dp"
设置其位置在底部并设置外边距
关于进度条的样式,参考如下

这里使用的进度条样式是
style="?android:attr/progressBarStyleHorizontal"
完整xml示例代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".ProgressBarActivity"> <ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:max=""
android:layout_alignParentBottom="true"
android:layout_marginBottom="50dp"
android:id="@+id/progressBar" /> </RelativeLayout>
然后来到Activity
要实现进度条的简单流程如下

首先在Activity中声明进度条对象、进度值、Handler对象。
关于Hnadler对象,因为Android不支持在主线程中更新UI控件,所以提供了Handler对象。
首先通过id获取进度条对象,然后实例化Handler,需要重写其handleMessage方法

在handleMessage方法中,通过msg的标识来判断是否完成进度条的加载。
然后需要新开一个线程,在线程中随机给进度条添加进度值,然后判断是否到100,进而报告不同的进度和标识变量。
完整示例代码
package com.badao.relativelayouttest; 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.ProgressBar;
import android.widget.Toast; import java.util.prefs.PreferenceChangeEvent; public class ProgressBarActivity extends AppCompatActivity { private ProgressBar progressBar;
private int mProgress = ;
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_bar); //获取进度条控件
progressBar = (ProgressBar) findViewById(R.id.progressBar);
//Android 不支持在主线程中更新UI组件 所以提供了Handler对象
mHandler = new Handler(){
//通过消息代码msg进行区分是否加载完成
@Override
public void handleMessage(@NonNull Message msg) {
if(msg.what ==0x111)
{
//给进度条赋值
progressBar.setProgress(mProgress);
}else
{
Toast.makeText(ProgressBarActivity.this,"加载完成",Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.GONE);
}
}
}; //新建一个线程
new Thread(new Runnable() {
@Override
public void run() {
while (true)
{
//具体执行的方法的进度,返回进度
mProgress = doWork();
//定义一个标识,标识进度条是否加载完成
Message message = new Message();
if(mProgress <)
{
//表示还没加载到100 则向进度条报告进度
message.what = 0x111;
mHandler.sendMessage(message);
}else
{
//表示此时已经加载完成,向Handler发送消息 并跳出循环
message.what =0x110;
mHandler.sendMessage(message);
break;
}
}
}
//具体执行 并返回进度的方法
private int doWork()
{
//进度条随机加进度
mProgress +=Math.random()*;
try {
//进程休眠0.5秒
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
return mProgress;
}
}).start(); //启动进程
}
}
Android中ProgressBar的使用-通过Handler与Message实现进度条显示的更多相关文章
- Android中消息系统模型和Handler Looper
http://www.cnblogs.com/bastard/archive/2012/06/08/2541944.html Android中消息系统模型和Handler Looper 作为Andro ...
- 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示
尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...
- android中ProgressBar和ListView
ProgressBar进度条的使用情况: 进度条的.xml声明:如果不声明格式,则默认格式为转圆圈的形式,声明进度条的visibility为不可见. <ProgressBar android:i ...
- Android中ProgressBar
ProgressBar提供如下方法来操作进度: setProgress(int):设置进度完成的百分比; incrementProgressBy(int):设置进度条的进度的增加或减少,具体取决于参数 ...
- Android开发学习之路-使用Handler和Message更新UI
在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,所以当我们需要在非主线程中更新UI控件,那么就需要用到Handler和Message来实现 Demo中,使用到一 ...
- handler 异步执行(进度条加载到100)
生明一个handler 对象(可重写handlerMessage 方法) 声明一个Runnable 对象,需重写run方法 按钮事件:handler对象实例的post方法调用线程. 线程的run方法开 ...
- android 开发-自定义多节点进度条显示
看效果图: 里面的线段颜色和节点图标都是可以自定义的. main.xml <RelativeLayout xmlns:android="http://schemas.android.c ...
- WinForm中使用BackgroundWorker异步加载数据并使用进度条
在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的.因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应:其次可 ...
- Android——音乐播放器完善——进度条显示当前播放进度,加可拖动进度条(未待解决完问题)
效果: 问题:可拖动进度条随进度条移动时,会致使音乐卡顿(待解决) xml <?xml version="1.0" encoding="utf-8"?&g ...
随机推荐
- Redis系列-存储hash主要操作命令
Redis系列-存储篇hash主要操作函数小结 hash是一些列key value(field value)的映射表.常常用其存储一些对象实例.相对于把一个对象的各个字段存储为string,存储为ha ...
- 创建dynamics CRM client-side (九) - 用JS来获取look up 信息
我们用以下的代码可以获取到look up 的信息. 大家可以查看微软文档来查看更多关于 lookup object的信息 https://docs.microsoft.com/en-us/powera ...
- cnblogs 美化主题
Silence主题 一个简洁的主题, 不带广告,我很喜欢 cnblogs 域名解析 这需要注意一点是:github.io项目名需要和用户名一致才能正确访问,否则会报404 Markdown格式化编辑 ...
- 爬虫之pyspider 安装
解决方法: 利用wheel安装 S1: pip install wheelS2: 进入www.lfd.uci.edu/~gohlke/pythonlibs/,Ctrl + F查找pycurl S3:这 ...
- maven jar 包问题
1. Failure to transfer... 这种错误基本是所需要的 jar 包不存在,或者下载不完整,可去本地仓库查看相关 jar 文件的完整性 解决方案: 删除对应 jar 包,重新下载(删 ...
- Kubernetes-Ingress资源详解
什么是Ingress #阿里云称之为ingress路由!在 Kubernetes 集群中,主要用于接入外部请求到k8s内部,Ingress是授权入站连接到达集群服务的规则集合,为您提供七层负载均衡能力 ...
- python笔记04
数据类型(二) 今日内容 1.列表 2.元组 内容回顾和补充 1.计算机基础 ①硬件:cpu,内存,硬盘,主板,网卡 ②操作系统:linux,centos, Ubuntu,redhat windows ...
- 技术派-常用的一些VS相关的宏名
用户宏 ConfigurationName 配置名字,通常是Debug或者Release IntDir 编译器使用的中间目录,产出obj文件 OutDir 链接器使用的输出目录 ProjectDir ...
- C语言中typedef用法
C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等) ...
- 必须收藏的MySQL高性能优化实战总结!
MySQL对于很多程序员来说,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是 ...