【第22期】观点:IT 行业加班,到底有没有价值?

Android Handler消息传递机制

原创 2016年08月31日 12:27:32

Android的UI操作不是线程安全的,所以多线程并发操作UI组件可能导致线程安全问题,所以规定:只允许在主线程中修改UI组件

Android的Handler消息传递机制解决了Android 的多线程问题,Handler是在主线程和子线程之间 传递信息的,就是两个线程间的“传话员”

Handler类主要作用是;1.在新线程中发送消息,2.在主线程中获取处理消息

在开发中要重写Handler的处理消息方法,当新线程启动发送消息时,消息会发送到关联的MessageQueue中,Handler会不断地从MessageQueue中获取并处理消息

Handler的handleMessage(Message msg)用于处理消息,任然在主线程中,新线程用sendMessage(Message msg)发送消息

子线程中sendMessage发送,在Handler或者Handler子类中使用handleMessage来处理消息实现主线程和子线程通讯

public class MainActivity extends Activity implements android.view.View.OnClickListener {

	private Button button;
	private TextView textView;
	private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button =(Button)findViewById(R.id.buttonId);
        textView = (TextView)findViewById(R.id.textViewId);
        //主线程中接收处理消息
        Handler handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				String s = (String)msg.obj;
				textView.setText(s);
			}
		};
        
        button.setOnClickListener(new OnClickListener(this));
        
    }
	
    @Override
	public void onClick(View v) {
		// 开启新线程并发送消息
		new NetThread(new Runnable(){
			@Override
			public void run() {
				// 模拟访问网路
				super.run();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				String s = "从网络获取的数据";
				Message msg = handler.obtainMessage();
				msg.obj = s;
				handler.sendMessage(msg);
				
			}
		}).start();	
	} 
}

·

Handler、Loop、MessageQueue的工作原理

Handler组件:

Message:消息对象,用于Handler接受处理

Looper:每个线程只能有一个Looper负责读取MessageQueue的消息,并发送给Handler

MessageQueue:管理Message

Handler正常工作在当前线程必须有一个Looper对象,Handler handler = new Handler();相当于Handler handler = new Handler(Looper.myLooper);

保证当前线程有Looper对象,可以有两种方法:

1.在主线程中初始化一个Looper对象,程序可直接创建Handler

2.自己创一个Looper对象并启动他,调用prepare()即可


在线程中使用Handler的步骤:

1.调用Looper的prepare()创建Looper对象

2.创建Handler子类的实例,重写handleMessage()方法

3.调用Looper的loop()方法启动

public class MainActivity extends Activity {

	private Button button;
	private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = (Button)findViewById(R.id.buttonId);
        button.setOnClickListener(new OnClickListener(){
			
			@Override
			public void onClick(View v) {
				System.out.println(Thread.currentThread().getName());
				Message msg = handler.obtainMessage();
				handler.sendMessage(msg);
			}
		});      
		
        WorkThread wt = new WorkThread();	//创建新线程
        wt.start();
    }

    class WorkThread extends Thread{
		@Override
		public void run() {
			Looper.prepare();	//1.创建Looper对象对象
			handler = new Handler(){	//2.创建Handler子类实例
				public void handleMessage(Message msg) {
					//处理方法
				}
			};
			Looper.loop();	//3.启动Looper
		}
    	
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Android21_Handler、Looper消息传递机制

一、Handler消息传递机制初步认识: (一)、引入:         子线程没有办法对UI界面上的内容进行操作,如果操作,将抛出异常:CalledFromWrongThreadEx...

Android技术点记录-handler消息传递机制

一、相关的一些基本概念  1. Android进程(该段内容来自网络参考)        当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默 认的情况下,所有该程序的组件都将在该进程和线程中运行。同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android 会尝试停止一些进程从而释放足够的资源给其他新

Android25_Handler、Looper消息传递机制

Handler、Looper消息传递机制 一、Handler消息传递机制初步认识: (一)、引入:         子线程没有办法对UI界面上的内容进行操作,...

Handler 消息传递机制

1,Handler 的概念 Handler 是用来干什么的? 1)执行计划任务,可以在预定的时间执行某些任务,可以模拟定时器 2)线程间通信。在Android的应用启动时,会创建一个主线程,主线程会创建一个 消息队列来处理各种消息。当你创建子线程时,你可以在你的子线程中拿到父线程中 创建的Handler 对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android 要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。 角色描述: 1) Looper: 一个线程可以产生一个

Android Handler消息传递机制

Looper的字面意思是“循环器”,它被设计用来使一个普通线程变成Looper线程。所谓Looper线程就是循环工作的线程。在程序开发中(尤其是GUI开发中),经常会需要一个线程不断循环,一旦有新任务...

Handler 消息传递机制介绍

好久没有碰Android了,现在由于项目需要,重拾Android。。。 下面介绍一下Android中的Handler消息传递机制。 在Android平台中,新启动的线程是无法访问Activity中的Widget,也不能把运行状态外送出来,这种就需要Handler机制进行消息的传递了。Handler类位于android.os包下,功能是完成Activity的[color=red]Widget[/color]与应用程序中[color=red]线程[/color]之间的交互。 Handler中的主要方法: public void handleMessage(Message msg) //子类

Android学习历程10-Handler消息传递机制

Handler消息传递机制

Android开发--多线程中的Handler机制/Looper的介绍

在多线程的开发中,Handler机制如同在主线程中运行一样,只是需要注意在非主线程中Handler机制的作用限制,本文将对这些内容作出解释。 * 如果应用上一个例子的方法对UI界面进行操作,将抛出异常,为此,Android中引入了Handler消息 * 传递机制,来实现在新创建的线程中操作UI界面,下面将对Handler消息传递机制进行介绍 * 一. * 循环者Looper简介 * 1.首先需

android Handler 消息传递机制

视频播放地址:http://v.youku.com/v_show/id_XNzMzNTc2ODg0.html

android线程间消息处理机制(Looper、Handler和Message)

<span style="color: #000000; font-family: Helvetica, Tahoma, Aria
  • gybin
  • gybin
  • 2013-11-20 15:17
  • 366
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)