`

消息通道Looper运用(9)

阅读更多

在我们使用Handler传递信息时,其实都是通过Looper通道的,当建立一个Handler对象时都是通过了LOOPER平时我们都是自动生成,但是当使用到用户自定义类handler就要自己手工调。

下面实现一个实例讲述looper作用:

布局文件代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="22dp"
        android:onClick="click"
        android:text="启动" />

</LinearLayout>

 

主Activity代码:

public class MainActivity extends Activity {

	private TextView info;
	private static final int set=1;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.info=(TextView)super.findViewById(R.id.info);
	}

	
    public void click(View v){
    	switch(v.getId()){
    	case R.id.but:
    		Looper looper=Looper.myLooper();
    		MyHandler myhandler=new MyHandler(looper);
    		myhandler.removeMessages(0);//清空所有的消息队列
    		String data="ee工作室创造科技前沿";
    		Message msg=myhandler.obtainMessage(set, 1, 1,data);
    		myhandler.sendMessage(msg);
    		break;
    	}
    	
    }
    private class MyHandler extends Handler{
    	public MyHandler(Looper looper){
    		super(looper);
    	}
    	public void handleMessage(Message msg){
    		switch(msg.what){
    		case 1:
    			MainActivity.this.info.setText(msg.obj.toString());
    		}
    	}
    	
    }

}

 

显示效果如下:



 看到这里你是不是举得奇怪,就是明明不用Looper只用Handler和Message也能实现这样的功能。那么接下来我们要变形啦,用另一种变形代码深入理解Looper通道

在主线程子线程各自设置一个Handler处理,并且开启通道,通道会不惑目前使用通道的线程。通道因为是隐式我们只能通过这种方式了解主子线程传递消息的过程

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/info"
        android:text="等待子线程发送消息"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="22dp"
        android:onClick="click"
        android:text="交互" />

</LinearLayout>

 

这里info实现显示主线程接收到的信息,按键表示主线程发送给子线程的信息

主函数代码

ublic class MainActivity extends Activity {

	private TextView info;
	private static final int SetMain = 1;
	private static final int SetChild = 2;
	private Handler mainHandler, childHandler;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.info = (TextView) super.findViewById(R.id.info);
		MainActivity.this.mainHandler = new Handler() {
			public void handleMessage(Message msg) {
				switch (msg.what) {
				case SetMain:
					MainActivity.this.info.setText("主线程接受到的数据: "+msg.obj.toString());
				}
			}

		};
		new Thread(new ChildThread(),"child thread").start();
	}

	public void click(View v) {
		if(MainActivity.this.childHandler!=null){
			Message childmsg=MainActivity.this.childHandler.obtainMessage();
			childmsg.obj=MainActivity.this.mainHandler.getLooper().getThread().getName()
					+"--->儿子我来啦";
			childmsg.what=SetChild;
			MainActivity.this.childHandler.sendMessage(childmsg);
		}

	}
	protected void onDestroy(){
		super.onDestroy();
		MainActivity.this.childHandler.getLooper().quit();//结束队列
		
	}

	private class ChildThread implements Runnable {

		
		
		public void run() {
			Looper.prepare();//初始化队列
			MainActivity.this.childHandler = new Handler() {
				public void handleMessage(Message msg) {
					switch (msg.what) {
					case SetChild:
						System.out.println("主线程发给子线程的消息:  "+msg.obj);
						//创建Message发给主线程
						Message toMain=MainActivity.this.childHandler.obtainMessage();
						toMain.obj="这是子线程发给主线程的消息:"+super.getLooper().getThread().getName();
						toMain.what=SetMain;
						MainActivity.this.mainHandler.sendMessage(toMain);
					}
				}

			};
			Looper.loop();//启动该线程的消息队列

		}

	}

}

 

这里很重要一点是建立Looper通道,如果不建立,子线程无法向主线程发送消息

 

 首先我们按交互按钮,控制台输出:

 

 这里说明子线程接受到了主线程发送的信息,并且显示当前使用通道线程是main主线程

主线程接收效果



 同理学到这里相信还是很多人有疑问,当主线程发送给子线程的信息为什么不直接更新在UI上,反而要通过后天输出,这里还是强调一点,在安卓中,不支持子线程直接向UI更新,如果要实现的话,就只使用一个handler实现。

 

0
0
分享到:
评论

相关推荐

    消息循环 Looper 及其源码解析

    在Android系统中,消息处理机制是应用程序中线程间通信的一种关键方式,它涉及到Handler、Message和Looper等组件。...在实际编程中,合理运用Looper、Handler和Message可以提高代码的可读性和可维护性。

    Android的消息处理机制--Looper,Handler

    `Handler`发送消息使用`sendMessage`或`post`等方法,接收消息则由`Looper`调度,`Handler`的`dispatchMessage`方法将消息分发到相应的处理方法。`Message`对象包含了消息的标识、数据以及处理消息的目标`Handler`。...

    Android开发中Looper.prepare()和Looper.loop()

     Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,使用Looper....

    关于Looper的使用

    了解了Looper的基本概念和使用方法后,开发者可以根据实际需求灵活运用。在项目中,合理地利用Looper、Handler和Message,可以实现高效的线程间通信,提高代码的可维护性和性能。在阅读和分析`LooperTest`相关的源码...

    Android Looper使用介绍

    Android 官方文档中对 Looper 的介绍中,Looper 被描述为一个用于运行消息循环的类,线程默认情况下没有消息循环,需要调用 prepare() 方法来创建消息循环,然后调用 loop() 方法来处理消息直到循环停止。...

    Handler和looper详解

    Handler可以通过Looper来实现消息处理机制,而Looper可以将消息发送到消息队列中,并等待消息的处理。Handler可以构造Looper对象,以便与Looper沟通,并将消息发送到消息队列中。 四、执行过程 当我们在子线程中...

    android Looper

    在Android系统中,`Looper`是一个至关重要的组件,...理解和熟练运用`Looper`,对于开发高效、流畅的Android应用程序至关重要。通过阅读指定的博客文章,你可以更深入地了解`Looper`的工作原理及其在实际项目中的应用。

    Handler + Thread + Looper

    总的来说,理解和熟练运用Handler、Thread和Looper对于Android开发者至关重要,因为它们是保证应用流畅运行、避免阻塞UI的关键。正确地利用这些工具,开发者可以实现高效的异步处理和UI更新,提升用户体验。

    管理MessageQueue的Looper使用

    在Android系统中,消息机制是实现线程间通信的关键组件,而`Looper`与`MessageQueue`则是这一机制的核心部分。本文将深入探讨`Looper`的使用及其在管理`MessageQueue`中的作用。 首先,`Looper`是Android系统中一个...

    Looper物件之角色(Demo 5)

    在Android系统中,Looper对象扮演着消息循环的重要角色,它是Android消息处理机制的核心组件之一。本文将深入探讨Looper的工作原理,以及如何在实际开发中利用它来实现高效、异步的事件处理。我们将通过一个名为...

    android Looper demo

    在Android开发中,`Looper`、`Handler`和`MessageQueue`是三个关键组件,它们共同构成了Android消息处理系统,用于实现线程间的通信,尤其是让UI线程能够响应非UI线程的数据更新。让我们深入探讨一下这些概念及其在...

    Looper物件之角色(Demo 1)

    在Android系统中,Looper对象扮演着至关重要的角色,它是消息处理机制的核心组件,使得Android应用能够实现异步消息的处理。本文将深入探讨Looper的工作原理及其在实际开发中的应用。 Looper,顾名思义,就是“循环...

    Looper Count测试Looper个数工具apk

    Looper Count测试Looper个数工具apk

    Handler与AsyncTask,Looper使用示例

    默认情况下,主线程有一个运行的`Looper`,而子线程需要手动调用`Looper.prepare()`和`Looper.loop()`来启动消息循环。 使用示例: ```java // 创建Handler实例 Handler handler = new Handler() { @Override ...

    Handler+Looper+MessageQueue

    它与 Looper 关联,可以发送 Message 到消息队列,并在适当的时间由 Looper 分发并处理这些消息。Handler 提供了 `sendMessage()` 和 `post()` 等方法来发送消息,同时提供了 `handleMessage()` 方法来处理接收到的...

    Android 线程之自定义带消息循环Looper的实例

    Android系统的UI线程是一种带消息循环(Looper)机制的线程,同时Android也提供了封装有消息循环(Looper)的HandlerThread类,这种线程,可以绑定Handler()对象,并通过Handler的sendMessage()函数向线程发送消息,...

    Handler、Looper

    在Android系统中,Handler、Looper和Message构成了一个关键的消息处理机制,用于实现UI线程和其他线程之间的通信。本文将从源码的角度深入探讨这个机制,帮助开发者理解其内部工作原理。 首先,我们来理解Handler的...

    android looper分析

    - **定义**: `Looper` 是 Android 消息处理机制的核心组件之一,主要负责管理主线程中的消息循环。 - **作用**: 在主线程中创建消息循环,使得应用程序能够持续接收并处理来自 `Message Queue` 的消息。 - **实例**:...

    handler与looper及messagequeue的简单总结

    在Android开发中,Handler、Looper和MessageQueue是用于实现线程间通信的关键组件,它们共同构建了一个消息处理机制。理解这三个概念以及它们之间的关系对于优化应用程序的性能和响应性至关重要。 Handler(处理器...

Global site tag (gtag.js) - Google Analytics