android中开启线程处理,Android线程与消息处理
一、实现多线程
1.创建线程
(1)通过Thread创建线程
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
});
(2)通过实现Runnable()接口创建线程
public class MainActivity extends Activity implements Runnable{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
@Override
public void run() {
// TODO Auto-generated method stub
}
}
2.线程的开启
thread.start();
3.线程的休眠
Thread.sleep(1000);//休眠1秒
4.中断线程
public class MainActivity extends Activity implements Runnable{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LooperThread thread = new LooperThread();
thread.start();
thread.interrupt();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(!Thread.currentThread().isInterrupted()){
// do something
}
}
}
二、Handler消息传递机制
前面介绍了现成的用法,不过不能在新建的子线程中对UI进行修改。如果要操作,会报错Only the original thread that created a view hierarchy can touch its views。为此,Android引入Handler消息传递机制,来实现在线程中操作UI界面。
1.循环者(Looper)简介
在Android中,一个线程对应一个Looper对象,一个Looper对象对应一个MessageQueue(消息队列)。MessageQueue用于存放message。在MessageQueue中,存放的消息按照FIFO原则执行。
Looper对象用来为线程开启一个消息循环,从而操作MessageQueue。默认情况下,系统自动为主线程创建Looper对象,开启消息循环。所以,在主线程中用下面的代码创建Handler对象不会出错,而在非主线程中则会报错。
Handler handler = new Handler();
如果想在非主线程中创建Handler对象,必须用到Looper:
public class LooperThread extends Thread {
public Handler h;
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Looper.prepare(); //
h = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.i("Looper", String.valueOf(msg.what));
}
};
Message m = h.obtainMessage();
m.what = 0x11;
h.sendMessage(m);
Looper.loop();
}
}
2.消息处理类(Handler)简介
Handler主要有以下两个作用:
(1)将Message或Runnable应用post()或sendMessage()方法发送到MessageQueue中,发送时可以指定延迟时间或者绑定的Bundle数据。当MessageQueue循环到该Message时,调用handlerMessage()方法对其处理。
(2)在子线程与主线程进行通信,也就是在工作线程中与UI进行通信
3.消息类(Message)简介
Message具有如下5个属性
1.arg1 int 用来存放整型数据
2.arg2 int 用来存放整型数据
3.obj Object用来存放发送给接收器的Object类型的任意对象
4.replyTo Messenger用来指定该Message该发往何处
5.what int 用户自定义消息代码
在使用时,需要注意以下3点:
1.通常使用Message.obtain()或Handler.obtainMessage()获取空消息对象,以节省资源
2.如果一个Message只需要携带简单的int信息,优先使用arg1和arg2来传递,这比Bundle节省内存
3.尽可能用Message.what来标识信息
android中开启线程处理,Android线程与消息处理相关推荐
- android中开启wifi,打开android系统设置,连接wifi
打开android系统设置,连接wifi wifi信号强度:得到的值是一个0到-100的区间值,是一个int型数据,其中0到-50表示信号最好,-50到-70表示信号偏差,小于-70表示最差,有可能连 ...
- 在Android中使用Handler和Thread线程执行后台操作
在 Android中使用Handler和Thread线程执行后台操作 对于线程的控制,我们将介绍一个 Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Message和Runn ...
- java线程画动图闪,Android中利用画图类和线程画出闪烁的心形,android心形,package com....
Android中利用画图类和线程画出闪烁的心形,android心形,package com.package com.tt.view;import android.content.Context;imp ...
- android 开启子线程方法,android中开启子线程
AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/ ...
- android 中开启线程的方法,android中开启的循环线程
拉莫斯之舞 你可以使用 RetrantLockprivate final ReentrantLock lock = new ReentrantLock(); if(toModify[j]==1) { ...
- Android开发——Android中常见的4种线程池(保证你能看懂并理解)
0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用 ...
- Android中常见的4种线程池的理解(转)
转:https://blog.csdn.net/l540675759/article/details/62230562 转:https://blog.csdn.net/seu_calvin/artic ...
- android中多线程与ui,Android UI线程和非UI线程
UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程. 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的UI组件发生交互. 所以主 ...
- Android中Activity、Service和线程之间的通信
Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...
最新文章
- hibernate教程--常用配置和核心API详解
- 关于mobile中datagrid的使用
- java barrier_Java并发类CyclicBarrier方法详解
- XML 语法速查笔记
- MUI下拉导航组件 - 应用篇
- 【干货】2020年研发运营安全白皮书.pdf(附下载链接)
- 《每个设计师都应该掌握的50个css代码段》11~20段
- 虚树(bzoj 3572: [Hnoi2014]世界树)
- matlab2c使用c++实现matlab函数系列教程-rot90函数
- 《我是一只IT小小鸟》读书笔记
- 迅雷mac版精简教程
- 微信H5开发wx.config授权invalid signature
- 图片去水印工具(Teorex Inpaint) v7.1
- R语言--Cox模型校准曲线原理(一)数据来源
- Dagger2 依赖注入框架介绍
- Reactor 反应堆
- 使用Windows10搭建服务器 ——一次虚拟机实验记录
- 2022-01-27 使用liquibase管理mysql执行版本
- 面向嵌入式开发的C++中间件库
- 【算法】_003_代码版式
热门文章
- SAP Spartacus baseSite设置的源头 - 路由事件
- SAP Spartacus core fromOccBaseSites逻辑
- jsp项目手动导出成war包
- Gradle中依赖任务产生的不同输出
- SAP Commerce的extensioninfo.xml
- how is view embedded via component usage being initialized
- create document history via code
- role menu for SAP_UI2_ADMIN_700
- SAP UI5 OData Json model name
- how can a model method trigger binding value refreshed