Android之十七 进度条和Hanlder

视频课:【免费】跨平台APP JQuery Mobile开发-1-初探移动开发-张晨光的在线视频教程-CSDN程序员研修院

构建进度条

在XML布局文件中使用ProgressBar标签布局视图

<ProgressBar

        android:id="@+id/progressbar"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        style="@android:style/Widget.ProgressBar.Horizontal"

        />

在Java代码中使用android.widget.ProgressBar类操作视图

ProgressBar  bar = (ProgressBar)findViewById(R.id.progressbar);

//设定进度条的取值范围0~n

bar.setMax(10);


在XML布局文件中使用SeekBar标签布局视图

<SeekBar

        android:id="@+id/seekbar"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        />

在Java代码中使用android.widget.SeekBar类操作视图

SeekBar seekBar = (SeekBar)findViewById(R.id.seekbar);

seekBar.setMax(10);

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()  

        {

                @Override

                public void onProgressChanged(SeekBar seekBar, int progress,

boolean fromUser) {

                        //这里填写处理事件的代码

                }

                @Override

                public void onStartTrackingTouch(SeekBar seekBar) {}

                @Override

                public void onStopTrackingTouch(SeekBar seekBar) {}

});

构建评分视图

XML布局文件中使用RatingBar标签

<RatingBar

        android:id="@+id/ratingbar"

        android:layout_width=“wrap_content"

        android:layout_height="wrap_content” />


事件监听接口为android.widget.RatingBar.OnRatingBarChangeListener,Java代码中使用android.widget.RatingBar类

.RatingBar  bar = (RatingBar)findViewById(R.id.ratingbar);

//设定评分视图显示的星的颗数

bar.setNumStars(5);

bar.setMax(10);


 

Handler简介

Handler相关知识介绍
Android应用的主线程,在应用程序启动时,Android会启动一条负责界面事件处理的主线程,当界面事件需要处理很长时间时,应该将任务放在一个子线程中运行
子线程不应该修改界面,因为主线程在负责,如果修改则线程不安全,Handler为解决子线程与主线程通讯而设立,在主线程运行时创建Handler对象
Handler对象将自动绑定到主线程中,主线程将会在消息循环过程中不停处理Handler中的数据处理需求,Handler提供了多种方法用于给子线程提供传递数据的方法:
post()、postAtTime()、postDelay()
sendMessage()、sendMessageAtTime()、sendMessageDelay()


实现淘宝自动播放动画步骤:
1.将要播放的动画复制到drawable目录
2.在布局文件中添加一个ImageView用于显示图片
3.在主线程中创建Handler处理图片更换动作
4.创建Timer(Timer自身就会启动一个子线程)定时发送消息

主视图Activity,图片资源代码如下:

//ImageView对象,用于显示图片

private ImageView image;

//定义数组,存储图片资源

private int[] images = {

R.drawable.image1,

R.drawable.image2,

R.drawable.image3,

R.drawable.image4,

R.drawable.image5,

};

int index = 0;//图片资源索引


定义Handler代码如下:

Handler handler = new Handler(){

//处理消息

@Override

public void handleMessage(Message msg) {

//如果是该线程发送的消息

if(msg.what==1)

{

//动态修改图片

image.setImageResource(images[index++%images.length]);

}

super.handleMessage(msg);

}

};


主视图Activity,onCreate()方法代码如下:

protected void onCreate(android.os.Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.handlertest);

image = (ImageView) findViewById(R.id.image);

//创建周期2秒的计时器,并创建执行任务

new Timer().schedule(new TimerTask() {

@Override

public void run() {

//发送一个what为1的空消息

handler.sendEmptyMessage(1);

}

},0,2000);

}


总结

上面代码中,Timer用于周期性执行指定任务,Timer对象可调度TimerTask对 象,TimerTask对象的本质就是启动一条新的线程,由于Android不允许其他线程修改Activity里的UI界面(因为不安全),因此新线程 只能发送一条消息,通知主线程更新界面。
Handler的作用就是建立主线程和子线程之间的纽带,子线程通过Handler对象发送消息,并回传给Handler,这样主线程就可以通过Handler处理消息了。

Handler机制原理解析

Handler工作中需要使用到以下组件:
Message:Handler接受和处理的消息对象
Looper:不断(死循环)读取MessageQueue中的Message对象,如果读到Message就将Message传递给发送该消息的Handler进行处理。每个线程只有一个Looper对象
MessageQueue:消息队列,以先进先出的方式管理Message对象,程序创建Looper对象时会在其构造器中创建MessageQueue对象

Handler的作用主要有两个:
1.在新启动的线程(子线程)中发送消息
2.在主线程中获取、处理消息
子 线程使用Handler发送消息(Message),被发送的消息必须被送到指定的消息队列(MessageQueue,由Looper管 理,Looper由子线程自己创建);主线程通过系统创建的Looper对象的looper()方法使用一个死循环不断取出MessageQueue中的 消息,并交由Handler处理,进而实现主线程中视图的改变

通过Handler消息传递机制修改Activity中文本信息

//创建Handler

Handler handler = new Handler(){

//处理消息

public void handleMessage(android.os.Message msg) {

if(msg.what==1)

{

txt.setText("update handler");

}

};

};

/启动新线程发送消息
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(3000);//线程沉睡3秒
            handler.sendEmptyMessage(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android handler机制是一种在Android中用于处理异步消息和线程通信的重要机制。其主要作用是将消息和任务抛到主线程的消息队列中,以便主线程按照一定的规则按照队列中的顺序处理这些消息和任务。 1. Handler的实例化:在Android中,创建一个Handler的实例可以通过以下两种方式实现: 直接实例化: 创建一个Hanlder对象,代码示例: Handler handler = new Handler(); 绑定Looper:在子线程中创建Handler的话,需要先通过以下代码获取Looper对象,然后再将其传入Handler的构造函数中: Looper looper = Looper.myLooper(); Handler handler = new Handler(looper); 2. Handler的使用:当一个线程需要将一个耗时的任务交给主线程去执行的时候,它可以使用Handler来完成。以下是Handler的常见用法示例: 使用Handler处理消息: Handler myHandler = new Handler() { public void handleMessage(Message msg) { //在这里处理消息 } }; Message msg = myHandler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("my_key", "my_string"); msg.setData(bundle); myHandler.sendMessage(msg); 使用Handler更新UI: Handler myHandler = new Handler() { public void handleMessage(Message msg) { //更新UI } }; myHandler.sendEmptyMessage(0); 3. Handler的原理:在Android系统中,所有的UI操作都必须在主线程上完成。这时,Handler就扮演了一个传递任务的中介角色。它把来自子线程的消息和任务封装成Message对象,最后以一定的顺序扔到主线程的消息队列中等待执行。主线程通过Looper不断地循环读取消息队列中的消息和任务,然后依次执行。这就是Handler机制的基本原理。 4. Handler配合其他机制使用:为了更好地发挥Handler的作用,还可与一些其他机制有效配合使用,例如:AsyncTask、MessageQueue等等。通过多种机制的相互配合,可以实现复杂的异步消息处理和并发控制,提升了Android应用程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zh.晨光

读后有收获可以支付宝请作者喝咖

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值