android Service中多线程交互
android 的service和activity是执行在UI主线程的。
在android线程中,仅仅有主线程即UI线程有自己的默认的消息队列。子线程须要创建自己的消息队列。并把消息发给队列,并循环起来,发给handler处理。
1、Looper.prepare();给子线程创建消息队列。
2、Looper.loop();把消息放入消息队列并循环起来。
例如以下是一个通过activity的oncreate()方法启动服务,在服务里开启子线程,并发消息给主线程来处理的DEMO。
3、MainActivity.java例如以下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(MainActivity.this,ServiceTest.class));
}
4、ServiceTest.java
public class ServiceTest extends Service {
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
new Thread(){
@Override
public void run() {
Log.i("服务", "第2个线程");
Looper.prepare();
for(int i=10;i<20;i++){
Toast.makeText(getApplicationContext(), i+"",0).show();
try {
//Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
}
mHandler.sendEmptyMessage(2);
Looper.loop();
};
}.start();
break;
case 2:
new Thread(){
@Override
public void run() {
Log.i("服务", "第3个线程");
Looper.prepare();
for(int i=20;i<30;i++){
Toast.makeText(getApplicationContext(), i+"",0).show();
try {
//Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
}
mHandler.sendEmptyMessage(3);
Looper.loop();
};
}.start();
break;
case 3:
onDestroy();
break;
default:
break;
}
super.handleMessage(msg);
}
};
public ServiceTest() {
// TODO Auto-generated constructor stub
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
Log.i("服务", "onCreate()");
super.onCreate();
new Thread(){
@Override
public void run() {
Log.i("服务", "第一个线程");
Looper.prepare();
for(int i=0;i<10;i++){
Toast.makeText(getApplicationContext(), i+"",0).show();
try {
//Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
}
mHandler.sendEmptyMessage(1);
Looper.loop();
};
}.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("服务", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.i("服务", "onDestroy()");
super.onDestroy();
stopSelf();
}
}
附:demo下载地址http://download.csdn.net/detail/u014600432/8104521
最新文章
- 1-ser2008系统封装实验报告
- Android错误
- Uva 524 Prime Ring
- STL中的查找算法
- poj1375Intervals(点到圆的切线)
- Class attributes
- http://www.cnblogs.com/yjmyzz/p/dubbox-demo.html
- C++实现glut绘制点、直线、多边形、圆
- InSAR在地面沉降监测中的应用及发展前景
- GCC 命令行具体解释
- Q_DISABLE_COPY
- Hibernate---第一个helloworld程序 (XML版本, annotation版本)
- NodeJs与ActionScript的GET和POST通讯
- Storm学习笔记六
- SpringMVC源码情操陶冶-ViewResolver视图解析
- Linux的文件系统及其硬盘分区挂载原理
- 关于加载font-awesome文字显示不出来
- php 常用的知识点归集(下)
- 此博客停更,转至lustforlife.cn
- Laravel 系列入门教程(三)【最适合中国人的 Laravel 教程】
热门文章
- adbd cannot run as root in production builds的解决方法
- python print 显示不同的字体
- Java基础学习分享
- BZOJ2134: 单选错位(期望乱搞)
- background-attachment css3属性
- Python学习笔记基础篇-(1)Python周边
- 三维重建:QT+OpenNI+Kinect图像校正
- 给html里面的class添加一个判断语句,判断当前class是否显示(vue)
- 洛谷P3807 【模板】卢卡斯定理_组合数学模板
- 解决phpstudy mysql 启动不了的问题