Android入门之Handler的使用教程详解
作者:TGITCIC 发布时间:2022-06-17 04:03:22
简介
我们在前面的Android教程中已经提到过这么一件事:Android在启动后会有一个主线程。它不允许任何子线程去改变主UI线程里的内容。
这么做是为了妨止,万一有一个带有大事务的线程导致了渲染组件时间过长最终导致Android UI出现“闪退”、“崩溃”的保护机制。
而实际我们在Android操作里的确是会有一些“耗时”的事情而采用异步线程,如:首页打开时调用第三方地图定位API、调用第三方银行API来显示你的余额、调用第三方社保显示你的当前社保缴纳费用和额度。
这种加载我们都会使用异步,一旦异步加载完后拿到结果再“刷新”在我们的主界面的控件里。那么此时由于Android的保护机制就不可以直接在异步线程里一个set()就完事了。
因此Android给我们提供了Handler机制。
Handler我们可以认为它是一个和Android主进程间的通道。
当异步任务、子任务等需要改变主UI线程里的控件的渲染、值、显示用变化,那么我们就通过Handler发一条消息。
当主线程Listener到了消息,然后就可以去做相应的值的改变和渲染了。
我们为了充分说明这个问题我们用一个ImageView,然后在里面每隔X毫秒,换一个图片从而实现下面这样的一个“动画”效果来说明Android里的Handler的使用方法。
项目结构
项目结构很简单,只有8个图,这8个图是8个桢。每X毫秒在原来的图位置上换一个图,然后滚播,以到达“动画”效果。
我把这8桢图给出,供各位自己去练习吧。
代码
前端
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context="org.mk.android.demohandlerwithanim.MainActivity" >
<ImageView
android:id="@+id/imgAnimation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
/>
</RelativeLayout>
后端
package org.mk.android.demohandlerwithanim;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
int imgids[] = new int[]{R.drawable.a_1, R.drawable.a_2, R.drawable.a_3, R.drawable.a_4, R.drawable.a_5, R.drawable.a_6, R.drawable.a_7, R.drawable.a_8};
int imgstart = 0;
ImageView imgAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imgAnimation = findViewById(R.id.imgAnimation);
Handler imgAnimationHandler = new ImgAnimatonHandler();
new Timer().schedule(new TimerTask() {
@Override
public void run() {
imgAnimationHandler.sendEmptyMessage(101);
}
}, 0, 100);
}
class ImgAnimatonHandler extends Handler {
@Override
public void handleMessage(Message msg) {
if (msg.what == 101) {
imgAnimation.setImageResource(imgids[imgstart++ % 8]);
}
}
}
}
代码导读
我们使用的是ImageView里的setImageResource来轮换图片做到动画效果;
我们使用了Handler,在Handler.handleMessage里来换ImageView里的图;
然后我们使用了一个Timer()的schedule线程,以每100毫秒向Handler发一个emptyMessage(101)这样的一个消息给到Handler的Listener,所以在handleMessage方法中如果what==101就“飞”。
最终就实现了这样的一个效果了
来源:https://blog.csdn.net/lifetragedy/article/details/128028900
猜你喜欢
- 本文主要对SpringBoot2.x参数校验进行简单总结,其中SpringBoot使用的2.4.5版本。一、引入依赖<dependen
- 微信小程序与aspnetcore signalr实例本文不对小程序与signalr做任何介绍,默认读者已经掌握aspnetcore Sign
- 本文实例为大家分享了C#类的多态性,供大家参考,具体内容如下第一种:编译时的多态性,直接这样说不知道说啥?程序执行过程主要分为三步:编译,链
- 一、abstract 抽象的抽象类:被abstract 修饰的类语法: abstract class 类名{}抽象方法 : 被a
- 昨天给各位总结了本人学习springboot整合mybatis第一阶段的一些学习心得和源码,主要就算是敲了一下SpringBoot的门儿,希
- 目录概述c#方法概述在微信支付中,当用户支付成功后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。接收微信支付异步
- 一直以来做对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,可以在接口上省去不少麻烦。swagger是一款方便展
- @Autowired注解在抽象类中失效最近在工作中遇到这个问题,在抽象类中使用Autowired这个注解,注入mybatis的dao时,总是
- ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它
- 1.编写源代码编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java。程序
- 本文实例为大家分享了java日期操作工具类,获取指定日期前一天、后一天;日期转换;两个日期之间相隔天数等工具类,供大家参考,具体内容如下im
- 1.概述数据库开发一直是JAVA开发的核心之一,作为现在JAVA EE的基石框架,Spring Boot自身携带了一个JDBCTemplat
- 本文实例讲述了Java设计模式之 * 模式。分享给大家供大家参考,具体如下: * 模式有三个要素——事件源、事件对象、 * 。事件源:顾名思
- 本文实例为大家分享了java实现马踏棋盘的具体代码,供大家参考,具体内容如下马踏棋盘算法介绍8X8棋盘,马走日字,要求每个方格只进入一次,走
- Servlet 实现文件上传所谓文件上传就是将本地的文件发送到服务器中保存。例如我们向百度网盘中上传本地的资源或者我们将写好的博客上传到服务
- 前言插入排序狭义上指的是简单插入排序(选择集合,比较大小,插入元素),广义上还应该包括希尔排序(分治思想)及其两种实现方式,最激动人心的是
- 最近因为用的发送邮件的地方,就查询了资料,总结以下几个方法1、利用新浪邮箱发送2、利用公司邮箱发送3、利用CDO发送,这种方式要引用Inte
- 前言Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5,它有两个核心方法:exchange(V
- 调用方法:/** * 点击量/月(年)Callable */ public void yearlyClickCallable() { //
- Java.lang 中自带的注解@Override:表示当前的方法定义将覆盖基类的方法。如果你不小心拼写错误,或者方法签名被错误拼写的时候,