• 在非UI线程中使用Handler实现请求队列


    Handler是Android中非常重要的类之一,通过Handler可以实现主线程的延时操作和线程之间的通信,通过在子类中的Handle、和Looper可以很轻松的实现一个请求队列。

    在写代码之前首先简要的说一下 Handler、Looper、MessageQuene之间的关系。

    每一个线程最多有一个Looper、一个Looper里边含有一个MessageQuene。

    Handler每次将消息发送到MessageQuene中,Looper用过一个死循环不断的从MessageQuene中获取消息,获取后,根据Message的target分发给对应的Handler进行处理。

    下边是我写的一个通过Handler和Looper实现的请求队列:

    package com.hou.looper;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.util.Log;
    
    public class DemoLooperActivity extends Activity {
    	private MyThread myThread = new MyThread();
    
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    
    		/*********** 模拟两个任务 ***********/
    		postToNoneUIThread(new Runnable() {
    
    			@Override
    			public void run() {
    				try {
    					Log.e("", "5 start");
    					Thread.sleep(5000);
    					Log.e("", "5 end");
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		});
    		postToNoneUIThread(new Runnable() {
    
    			@Override
    			public void run() {
    				try {
    					Log.e("", "1 start");
    					Thread.sleep(1000);
    					Log.e("", "1 end");
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    
    			}
    		});
    		/*********** 模拟两个任务OVER ***********/
    
    	}
    
    	public void runOnNoneUIThread(Runnable r) {
    		new Thread(r).start();
    	}
    
    	/**
    	 * 放入到子线程队列中
    	 * */
    	public void postToNoneUIThread(Runnable r) {
    		// 执行到这里的时候,子线程可能尚未启动,等待子线程启动,等待的时间会很短,
    		while (myThread.handler == null) {
    		}
    		myThread.handler.post(r);
    		myThread.handler.sendEmptyMessage(100);
    	}
    
    	/**
    	 * 可以设计为网络请求队列
    	 * */
    	class MyThread extends Thread {
    		{
    			start(); // 类加载完成后直接启动
    		}
    		private Handler handler;
    
    		@Override
    		public void run() {
    			while (true) {
    
    				Looper.prepare(); // 创建该线程的Looper对象
    				handler = new Handler(Looper.myLooper()) {
    					public void handleMessage(android.os.Message msg) {
    						Log.i("handleMessage", "" + msg.what);
    					};
    				};
    
    				Looper.loop(); // 这里是一个死循环
    				// 此后的代码无法执行
    			}
    		}
    	}
    }
  • 相关阅读:
    路飞学城-Python爬虫集训-第二章
    路飞学城-Python爬虫集训-第一章
    pymysql 使用
    Mysql 用户管理和权限设置
    spring data jpa
    thymeleaf学习
    Spring Boot技术栈博客笔记(1)
    SpringBoot学习(2)
    使用idea引入注解@SpringBootApplication报错Cannot resolve symbol 'SpringBootApplication'
    SpringBoot学习(1)
  • 原文地址:https://www.cnblogs.com/ihou/p/2660655.html
Copyright © 2020-2023  润新知