【多线程,UI更新与异步处理机制】线程整合笔记

一.基础三种线程方式

1.【继承法,耦合度高】定义一个线程:新建一个类继承自Thread,重写父类run方法即可

在这里插入图片描述
2. 新建实例对象,通过start()即可执行线程的run操作
在这里插入图片描述

2. 【实现接口法】:实现Runnable接口,调用时通过new这个实现的接口对象,再将其传入Thread构造方法再start即可

在这里插入图片描述

3. 匿名类方式

在这里插入图片描述

  1. Kotlin直接就打开就行了
    在这里插入图片描述

二.线程与更新UI

1. 异步消息处理机制介绍:

  1. Message(传递的消息)
  2. Handler(处理者,发送和处理消息)
  3. MessageQueue(消息队列存放消息)
  4. Looper(执行线程中的message循环,调用Looper的loop()方法后就会进入无限循环,每发现Queue中存在一条消息,就会将其取出)

2. 采用Handler从子线程发送handleMessage回主线程,使用匿名内部类

    private Handler handler = new Handler() {
    
    

        public void handleMessage(Message msg) {
    
    
            switch (msg.what) {
    
    
                case UPDATE_TEXT:
                    // 在这里可以进行UI操作
                    text.setText("Nice to meet you");
                    break;
                default:
                    break;
            }
        }

    };
                new Thread(new Runnable() {
    
    
                    @Override
                    public void run() {
    
    
                        Message message = new Message();
                        message.what = UPDATE_TEXT;
                        handler.sendMessage(message); // 将Message对象发送出去
                    }
                }).start();

3. 子线程中新建Handler方式【不然会报错】

在这里插入图片描述

三.使用AsyncTask【抽象类需继承】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//启动任务:
	new DownloadTask().execute()
 
	//新建类继承AsyncTask:
	class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
    
    //不需要传参给后台任务,进度显示单位为int,使用boolean来反馈执行结果
		
		protected void onPreExecute() {
    
    
			progressDialog.show(); // 显示进度对话框
		}
		
		@Override
		protected Boolean doInBackground(Void... params) {
    
    
			try {
    
    
				while (true) {
    
    
					int downloadPercent = doDownload(); // 这是一个虚构的方法
					publishProgress(downloadPercent);
					if (downloadPercent >= 100) {
    
    
						break;
					}
				}
			} catch (Exception e) {
    
    
				return false;
			}
			return true;
		}
		
		@Override
		protected void onProgressUpdate(Integer... values) {
    
    
			// 在这里更新下载进度
			progressDialog.setMessage("Downloaded " + values[0] + "%");
		}
		
		@Override
		protected void onPostExecute(Boolean result) {
    
    
			progressDialog.dismiss(); // 关闭进度对话框
			// 在这里提示下载结果
			if (result) {
    
    
				Toast.makeText(context, "Download succeeded",Toast.LENGTH_SHORT)
.show();
			} else {
    
    
				Toast.makeText(context, " Download failed",	Toast.LENGTH_SHORT).show();
			}
		}
	}

四.通过postDelayed进行延时消息

1. View控件进行[Post延时,就是在主线程中的]

  1. 例一
    在这里插入图片描述
  2. 例二
Handler().postDelayed(Runnable {
    
     rotateAnimation!!.start() }, 2000)

2.handler延时

  1. handler方法其中有send和post两种方法
    1)大家常用的send方法,其是在工作线程中处理完耗时操作后调用handler的sendMessage(message)把message对象发送给主线程,在主线程中重写handlerMessage()方法,
    2)而post方法传递的是一个runnable对象,更新UI的操作也是在这个runnable的run方法中进行的,也就是说run方法中的代码是执行在主线程中的,虽然它是写在工作线程中,主线程在接收到消息后自动执行runnable的run方法中的代码。)
    send和post源码
    注解
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    t

5. 使用runOnUiThread线程判断及切换主线程进行toast的线程处理

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38304672/article/details/112406941
今日推荐