android_handler(三)

Android跨线程消息传递
本文介绍如何在Android中实现MainThread向WorkThread发送消息的过程。通过创建Looper对象、使用Handler对象,实现在不同线程间的消息传递。文章还解释了为何主线程中不需要手动创建Looper对象的原因。

这篇记录 android 消息机制中,MainThread 向 WorkThread 发送消息。( MainThread → WorkThread )

步骤:
1、准备looper对象
2、在子线程中生成handler对象
3、在MainThread发送消息

代码:
layout:

<Button
        android:id="@+id/buttonId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送消息" />
activity:
package com.away.b_08_handler03;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

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("OnClick:" + Thread.currentThread().getName());
				Message msg = handler.obtainMessage();
				handler.sendMessage(msg);
			}
		});

		WorkerThread wt = new WorkerThread();
		wt.start();
	}

	class WorkerThread extends Thread {
		@Override
		public void run() {
			// 准备Looper对象
			Looper.prepare();
			// 在Workers Thread当中,生成一个Handler对象,用匿名内部类实现
			handler = new Handler() {
				@Override
				public void handleMessage(Message msg) {
					System.out.println("WorkerThread:" + Thread.currentThread().getName());
					System.out.println("收到了消息对象!!");
				}
			};
			// 调用Looper的loop方法之后,Looper对象将不断地从消息队列当中取出消息对象,然后调用Handler的handleMessage()方法处理该消息对象
			// 如果消息队列当中没有对象,则该线程阻塞.
			Looper.loop();
		}
	}
}
效果:


那么,为什么前边的示例中,我们怎么没有看到Looper.prepare()和Looper.loop()的调用呢?原因在于,我们的Activity是一个UI线程,运行在主线程中,Android系统会在Activity启动时为其创建一个消息队列和消息循环。

欢迎交流 http://blog.youkuaiyun.com/ycwol/article/details/42084905

<think>我们正在讨论个核心问题:1.GL线程在Android中的概念和作用2.日志信息"updateheavytaskinfoin1.5RecognizeInterval"的含义3.Android内核日志中hans_handler的具体含义首先,关于GL线程:-GL线程即OpenGLES渲染线程,负责执行图形渲染命令。-在Android中,它通常是一个独立的线程,与UI主线程分离,以确保渲染不阻塞用户交互。-作用:处理顶点数据、纹理、着色器等,将图形数据通过GPU渲染到屏幕。其次,日志信息分析:-该日志出现在1.5秒的识别间隔(RecognizeInterval)中,表示在执行一个繁重的任务(heavytask)。-可能的问题:这个繁重任务如果在GL线程上执行,可能导致渲染延迟(因为GL线程被阻塞),从而引起卡顿。最后,关于内核日志中的hans_handler:-根据公开资料,hans_handler是华为EMUI系统中一个与功耗管理相关的内核模块。-功能:监控应用行为,限制后台应用的异常唤醒和资源占用,以优化电池续航。-它属于华为的HANS(华为应用后台管理服务)机制。下面详细展开:</think>### GL线程概念及作用 **GL线程**(OpenGL ES渲染线程)是Android图形系统的核心组件: 1. **基本定义** - 专用于执行OpenGL ES图形API调用的独立线程 - 与UI主线程分离,避免渲染阻塞用户交互 - 通过EGL接口与GPU驱动通信 2. **关键作用** ```mermaid graph TB A[GL线程] --> B[管理GPU资源] A --> C[执行渲染管线] A --> D[交换显示缓冲区] C --> E[顶点处理] C --> F[片段着色] C --> G[纹理映射] ``` - 负责每帧的图形渲染流水线(顶点处理→光栅化→像素着色) - 管理纹理/缓冲区等GPU资源生命周期 - 通过`eglSwapBuffers()`提交渲染结果到SurfaceFlinger[^1] 3. **性能特性** - 必须维持60FPS(每帧≤16ms) - 阻塞会导致界面卡顿或ANR - 典型代码结构: ```java class GLThread extends Thread { public void run() { EGLContext context = initGL(); // 创建EGL上下文 while (active) { glDrawElements(...); // 执行绘制命令 eglSwapBuffers(display, surface); // 提交帧 } } } ``` --- ### 日志分析:"update heavy task info in 1.5 RecognizeInterval" 该日志表明在**识别周期任务**中出现性能问题: 1. **关键含义** - `1.5 RecognizeInterval`:1.5秒的周期性识别任务 - `heavy task`:存在耗时的计算或渲染操作 - 潜在风险:可能阻塞GL线程导致丢帧 2. **优化方向** | 问题点 | 解决方案 | |--------|----------| | CPU密集型识别 | 迁移到工作线程 | | 纹理处理耗时 | 预加载/压缩纹理 | | 数据传递延迟 | 共享内存替代IPC | --- ### `hans_handler`内核日志解析 `hans_handler`是华为EMUI系统的**资源管控模块**: 1. **核心功能** - **H**uawei **A**pplication **N**etwork **S**ervice的缩写 - 监控应用后台行为(网络/WakeLock/CPU等) - 限制异常资源占用(如防止恶意保活) 2. **日志触发场景** - 应用频繁唤醒设备(如心跳包) - 后台高CPU占用(如定位服务) - GL线程被后台任务阻塞时 3. **与GL线程关联** 当渲染线程因后台任务阻塞时,`hans_handler`可能: - 降低异常进程的CPU配额 - 限制网络访问防止资源竞争 - 输出日志如:`hans_handler: [package] GL blocked 1500ms` --- ### 技术原理图 ```plain Android图形架构 ┌─────────────┐ ┌──────────────┐ ┌───────────┐ │ App UI线程 │───▶│ GL线程 │───▶│ Surface- │ └─────────────┘ │ -执行OpenGL │ │ Flinger │ │ -提交缓冲区 │ └───────────┘ ┌─────────────┐ └──────────────┘ │ │ 识别任务 │─────▶ hans_handler监控 ▼ └─────────────┘ (资源超限时限制) 显示设备 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值