今天学习到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方法里,而多线程中只需要发送指令信息,不需要延时;


最终效果如下:

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



相关文章:

  • 2021-07-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-05
  • 2021-10-14
  • 2021-12-26
  • 2021-11-03
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案