Android之十七 进度条和Hanlder

ぐ巨炮叔叔 提交于 2021-01-13 07:33:03

视频课:https://edu.csdn.net/course/play/7621

构建进度条

在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();










 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!