Hander多线程实现ProgressBar的自动完成

来源:互联网 发布:java核心技术卷2 编辑:程序博客网 时间:2024/06/07 05:52

今天学习到Android的多线程部分,简单总结一下,并做了个简单的Demo:

在安卓应用程序中一些耗时的操作,比如读取数据,UI更新,网络数据传输等任务不能在主线程中进行,否则会造成UI阻塞,给用户带来不良的体验甚至5秒后还卡主就显示ANR错误;所以在程序中我们使用多线程来执行这些操作,在安卓中也叫信息传递 机制:

主要内容如下:

1、多线程的实现方式:Thread和实现Runnable接口;

2、创建Hander对象发送并处理信息


1.1线程的创建:

1:Thread thread = new Thread(new Runnable){

//重写run方法

public void run(){

//要执行的操作}

}


2:通过Runnable接口

public class ClassName extends Object inplements Runnable{

//重写run方法

public void run(){

//要执行的操作}

}


------------------------------------------------------------------------------------------------------------------------------------------------------------

2:Hander的信息传递:

1、实例化Hander对象

2、执行发送信息:

3;重写信息处理handMessage();

在这个过程中注意Looper的使用

在实例化hander之前需要先准备Looper.prepare();最后需要启动Looper.loop();


3:以下是一个多线程配合ProcessBar自动填充的实例:

3.1:是布局文件,主要是添加一个ProcessBar的控件和一个发送多线程的按钮:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:orientation="vertical"    android:layout_height="match_parent">    <ProgressBar        style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"        android:id="@+id/process"        android:max="100"        android:progress="10"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <Button        android:text="发送延时"        android:id="@+id/send"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>


3.2,以下是主要功能代码“:


import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.ProgressBar;import android.widget.Toast;public class Progress extends AppCompatActivity {    private final int flag=1;    private ProgressBar progressBar;    private Button sennd;    int amount = 0;    private Handler handler= new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case flag:                    progressBar = (ProgressBar) findViewById(R.id.process);                    if (amount!=100){                        handler.sendEmptyMessageDelayed(flag,1000);                    amount++;                    progressBar.setProgress(amount);                    }else {                        Toast.makeText(Progress.this, "下载完成", Toast.LENGTH_SHORT).show();                    }                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_progress);        initView();    }    private void initView() {        progressBar = (ProgressBar) findViewById(R.id.process);        sennd = (Button) findViewById(R.id.send);        sennd.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {             Thread thread = new Thread(new Runnable() {                 @Override                 public void run() {                     handler.sendEmptyMessage(flag);                 }             });            thread.start();                };        });    }}
代码总体比较简单;但是在实现进度条的自增需要注意Hander延时发送信息写在if方法里,而多线程中只需要发送指令信息,不需要延时;


最终效果如下:




阅读全文
0 0
原创粉丝点击