实例讲解Android多线程应用开发中Handler的使用
作者:张钊 发布时间:2021-11-23 03:23:13
标签:Handler
其实可以理解Handler为主线程和另外的线程之间进行数据更新的东东,并且Handler在主线程中,并在Handler直接调用线程的run方法
package com.Handler02;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
public class Handler02Activity extends Activity {
/** Called when the activity is first created. */
private Handler handler=new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler.post(thread1);
setContentView(R.layout.main);
System.out.println("================Main==============="+Thread.currentThread().getId());
System.out.println("============Main========="+Thread.currentThread().getName());
}
Runnable thread1=new Runnable() {
@Override
public void run() {
System.out.println("======thread1==============="+Thread.currentThread().getId());
System.out.println("========thread1============"+Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (Exception e) {
// TODO: handle exception
}
}
};
}
结果是主线程等待10s后才显示出来,并且线程ID
package com.Handler4;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
public class Handler4Activity extends Activity {
/** Called when the activity is first created. */
private TextView textView;
private MyHandler myHandler=new MyHandler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView=(TextView)this.findViewById(R.id.textView1);
}
class MyHandler extends Handler{
//从消息队列中取出并handleMessage处理消息
@Override
public void handleMessage(Message msg) {
textView.setText((String)msg.obj);
}
}
public void download(View view){
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
try {
String s="zhangzhao";
Thread.sleep(5000);
//数据发送出来
//textView.setText(s);
Message message=Message.obtain();//最好不要new,这个obtain会节省资源
message.obj=s;
myHandler.sendMessage(message);//没有指定looper那么就会发送给主线程中的looper
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
thread.start();//会出错原因是在非UI线程里面直接操作UI
//主线程维护了一个消息对列,当其他的线程有数据需要传递给主线程的时候,你就把数据封装成一个Message对象,然后放在主线程的
//消息队列中去,对应消息的处理由Looper,子线程通过Handler把下载完的数据封装到Message里面,然后把消息取出来交给Handler进行处理
//通过Handle和Message实现两个线程之间达到共享数据
}
}
package com.Handler5;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class Handler5Activity extends Activity {
/** Called when the activity is first created. */
private ProgressBar progressBar;
private Button button;
private TextView textView;
private MyHandler myHandler=new MyHandler();
int i=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
progressBar = (ProgressBar)this.findViewById(R.id.progressBar1);
textView=(TextView)this.findViewById(R.id.textView1);
}
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
int pos =(Integer)msg.obj;
progressBar.setProgress(pos);
textView.setText(pos+"%");
}
}
public void downLoad(View view){
new Thread(new Runnable() {
@Override
public void run() {
while(i<=100){
try {
Thread.sleep(300);
i+=10;
Message message=Message.obtain();
message.obj=i;
myHandler.sendMessage(message);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
}
效果:


猜你喜欢
- 1.新建springBoot项目在前面有两种方式2.加入thymeleaf模板引擎SpringBoot推荐使用thymeleaf模板引擎语法
- 1.ArrayList以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数
- 一、简述mybatis驼峰式命名规则自动转换:使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”;使用
- 目前在公司做一个小东西,里面用到了 FFmpeg 简单处理音视频,感觉功能特别强大,在做之前我写了一个小例子,现在记录一下分享给大家,希望大
- hbase是运行在Hadoop上的NoSQL数据库,它是一个分布式的和可扩展的大数据仓库,也就是说HBase能够利用HDFS的分布式处理模式
- Android自定义View实现等级滑动条的实例实现效果图:思路: 首先绘制直线,然后等分直线绘制点; 绘制点的时候把X值存到集
- java 指定某个jdk版本方法指定某个jdk版本方法背景:当我们在同一台机器上运行多个Java程序,但是所需的java版本不同,此时就需要
- C#编程语言非常优美,我个人还是非常赞同的。特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于
- 1 低层级 asyncio 索引低层级 API 索引¶ 列出所有低层级的 asyncio API。1.1 获取事件循环获取
- 熬夜写完,尚有不足,但仍在努力学习与总结中,而您的点赞与关注,是对我最大的鼓励!在一些本地化项目开发当中,存在这样一种需求,即开发完成的项目
- 实现过滤请求有两种方式:一种就是用 * ,一种就是过滤器 * 相对来说比较专业,而过滤器虽然不专业但是也能完成基本的拦截请求要求。一、 *
- 配置绑定所谓配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,
- 1,现在因为遇到一个读取pdf文件文本信息遇到乱么问题,才找到这个文本字符串的编码转换的实现方式来判断是否存在乱码(0>乱码>2
- 1、功能需求本实例将通过c# winform实现简单的分页功能,需要的基础知识有SQL语句,c#语言基础以及c# winform的一些简单知
- 前言传统的Restful API 存在诸多的问题,首先它无法控制返回的字段,前端也无法预判后端的返回结果,另外不同的返回结果对应不同的请求地
- 日常的Rest服务开发我都会首选SpringBoot,因为它本身的易用性以及自带的各种方便功能、生态等,今天就简单讲一下如何将Spring
- GitHub有一个开源控件PickerView,可以实现 * 联动的效果。虽然该控件使用非常简单,但是填充数据异常繁琐。GitHub上的Dem
- 本文实例为大家分享了Android实现简单画图画板的具体代码,供大家参考,具体内容如下效果如图:布局文件:<RelativeLayou
- spring和mybatis整合整合思路需要spring通过单例方式管理SqlSessionFactory。spring和mybatis整合
- 详解Android Studio正式签名进行调试的实现步骤在Android Studio中,可以使用Gradle进行打包时自动签名。其实An