android中的一些耗时操作,例如网络请求,如果不能及时响应,就会导致主线程被阻塞,出现ANR,非常影响用户体验,所以一些耗时的操作,我们会想办法放在子线程中去完成。

android的UI操作并不是线程安全的,所以多个线程并发操作UI组件的时候,则可能导致线程安全问题。为了解决这个问题,android只允许UI线程修改UI组件。

public class MainActivity extends AppCompatActivity

{

TextView textView;

Button changeText;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

changeText = (Button)findViewById(R.id.btn);

textView = (TextView)findViewById(R.id.textView);

changeText.setOnClickListener(this);

}

public void change(View view)

{

switch (view.getId())

{

case R.id.btn:

new Thread(new Runnable() {

@Override

public void run() {

textView.setText("被改变了");

}

}).start();

break;

default:

break;

}

}

}

在xml中定义了一个按钮和一个TextView,当点击按钮的时候,开启子线程去更改TextView中的文字,但是在编译的时候是无法通过的,因为不允许在子线程中直接对UI线程中组件进行操作。

需要借用Handler来实现子线程更新UI组件的功能。

public class MainActivity extends AppCompatActivity

{

private TextView textView;

private Handler handler = new Handler()

{

//接收的是消息队列中的msg

public void handleMessage(Message msg)

{

switch (msg.what)

{

case 0x0001:

int index = msg.arg1;

textView.setText(index + "");

break;

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView = (TextView)findViewById(R.id.textView1);

}

public void changeNumber(View view)

{

switch (view.getId())

{

case R.id.btn:

new Thread()

{

public void run()

{

for(int i = 0; i < 10; i++)

{

Message msg = new Message();

//msg.what是必不可少的,需要用来做判定

msg.what = 0x0001;

msg.arg1 = i;

handler.sendMessage(msg);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}.start();

break;

}

}

}

MessageQueue消息队列

android采用的是MessageQueue机制保证线程间通信。

MessageQueue是一个消息队列,用来存放通过Handler发布的消息,Android在第一次启动程序的时候会默认为UI线程创建一个关联的消息队列,用来管理程序的组件,如Activity、BroadcastReceiver、Service等。

Handler消息传递机制

工作线程通过handler对象和主线程进行通信

Handler对象所有工作都在主线程中执行

Handler类需要实现handleMessage()方法,来处理消息队列中取出的Message对象

handleMessage()方法由主线程调用,可以在需要的时候更新UI线程,但是必须确保此方法快速完成,因为其他的UI操作会等待它完成才能执行

多线程android代码,android入门 — 多线程(一)(示例代码)相关推荐

  1. python实现杨辉三角思路_Python极简代码实现杨辉三角示例代码

    Python极简代码实现杨辉三角示例代码 杨辉三角,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列. 把每一行看做一个list,写一个generator,不断输出下一行的list ...

  2. python抠图精确到发丝_Python用5行代码实现批量抠图的示例代码

    前言 对于会PhotoShop的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图.不过一些比较复杂的图,有时候还是要画点时间的,今天就给大家带了一个非常快速简单的办法,用Python来批量抠 ...

  3. python抠图_Python用5行代码实现批量抠图的示例代码

    前言 对于会PhotoShop的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图.不过一些比较复杂的图,有时候还是要画点时间的,今天就给大家带了一个非常快速简单的办法,用Python来批量抠 ...

  4. 转:Android判断当前网络是否可用--示例代码

    在Android平台上开发基于网络的应用,必然需要去判断当前的网络连接情况.下面的代码,作为例子,详细说明了对于当前网络情况的判断. 先看一个自己定义的应用类. 源码copy to clipboard ...

  5. android相对布局代码,Android基础_3 Activity相对布局(示例代码)

    相对布局要比前面讲的线性布局和表格布局要灵活一些,所以平常用得也是比较多的.相对布局控件的位置是与其周围控件的位置相关的,从名字可以看出来,这些位置都是相对的,确定出了其中一个控件的位置就可以确定另一 ...

  6. Android实现语音发送播放功能以及示例代码

    本文链接:https://blog.csdn.net/qq_40785165/article/details/109658968 大家好,我是小黑,一个还没秃头的程序员~~~ 这是我第一次写文章,也是 ...

  7. android 引入 .so,android studio引入so库方法(示例代码)

    在Android Studio中引入so库,只需在app/jniLibs下放入so文件,然后在Module的build.gradle中加入: sourceSets { main { jniLibs.s ...

  8. 线段树 java_线段树合并:从入门到放弃(示例代码)

    感谢这篇博客(这里跳转)以及邱宇大神的讲解,我也算作入门(自闭)了. 需要掌握的前置知识点:动态开点线段树.权值线段树. 一.合并思想 线段树合并,就是指建立一颗新的线段树,保存原有的两颗线段树的信息 ...

  9. python项目实例代码-python开源项目及示例代码

    下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 re 正则表达式的标准库. StringIO / cS ...

  10. 微信php实例代码_php微信公众平台示例代码分析(二)

    一.摘要 微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下. 二.获取代码 三.分析代码 完整代码如下: /** * wechat php test */ / ...

最新文章

  1. MessageBox不能应用皮肤的解决办法
  2. 5、Makefile基础知识汇总(转自陈皓总述)
  3. 美国人跨入中产行列的6个指标。
  4. Asp.net序中常用代码汇总(五)
  5. sqlserver存储过程入门之 游标
  6. Acer 4750 安装黑苹果_黑苹果系统安装通用教程图文版
  7. json string 格式_GO小知识之如何做JSON美化
  8. C++Socket编程总结
  9. pandownload软件下载
  10. windows编程点滴(一)之Windows获取系统中所有进程
  11. Docker详解(三)——Docker安装与部署
  12. 获取Map集合中数据的方法
  13. .Net面试经验总结
  14. PostgreSQL的学习心得和知识总结(八十九)|深入理解PostgreSQL数据库开源MPP扩展Citus再平衡函数rebalance_table_shards的实现原理
  15. 御坂坂的C++学习之路(3)-----函数-----stdarg.h
  16. 女人拉屎故事_一个敏锐的女性下午的故事
  17. window版加密磁盘
  18. nginxgrafana监控面板显示nodatatoshow
  19. 设计模式详解:抽象工厂模式
  20. 【MR】现代机器人学算法库---计算力矩控制

热门文章

  1. 无人机成为黑客的新工具,可黑掉部分家用的智能设备
  2. 验证字符串是否回文 Valid Palindrome
  3. Sql语句查询当天本周本月记录的where条件
  4. IIS 6.0 SSL证书安装
  5. python 如何定义一个变量为数字_python – 如何在Pandas / Numpy中确定列/变量是否为数字?...
  6. 【工程项目经验】Compile Android Error fatal error opening dependency file No such file or directory
  7. 计算机组装已维护的学术报告,计算机硬件组装维护的策略研究
  8. C语言-浮点型(float/double/E)
  9. Spring-读取properties文件
  10. 博客园php教程,PHP仿博客园,个人博客(1)_PHP教程