开始前的话
啃找到的那两本好书,有些收获。不过这周我时间是在太赶,下周的My Android Series
系列再开坑写那些安卓底层、开发技巧的东西。
这篇博文,我打算写写多线程、网络和蓝牙,一直以来自己对网络开发和多线程的掌握一直都不太好,也缺少开发实践;蓝牙则是这次写项目要用到,粗略看了下资料发现蓝牙和socket编程十分相似,所以也放到一块来说。
(好像这样的话一篇博文会特别长,我还是分成三篇来写吧——多线程+Service、网络、蓝牙)
Android中的多线程 及 Service(服务)
这里先说一下多线程和异步消息处理机制,因为Service是
Android 多线程 和 异步消息处理机制
多线程
andorid
中的多线程和Java十分类似,语法都基本一样。
- 继承Thread
class MyThread extends Thread{
@Override
public void run(){
//具体逻辑
}
}
然后要用的时候 new一个MyThread实例,调用start()方法就ok
new MyThread().start();
- 实现Runnable
class MyThread implements Runnable{
@Override
public void run(){
//具体逻辑
}
}
启动线程的时候要改一下。使用Thread的构造函数接收一个Runnable参数,这里就是new出的MyThread对象;然后再调用Thread的start方法
MyThread myThread = new MyThread();
new Thread(myThread).start();
- anroid 中一些需要注意的东西
- 无论何时启动APP,所有的组件都会运行在一个单独的线程中(默认的)——叫做主线程。这个线程主要用于处理UI的操作并为视图组件和小部件分发事件等,因此主线程也被称作UI线程。
- 如果你在UI线程中运行一个耗时操作,那么UI就会被锁住,直到这个耗时操作结束。这是很不友好的用户体验设计,这就是为什么要把一些复杂的工作移动到其它的线程中去执行。如果你在UI线程中运行一个耗时的任务,那么很有可能会发生ANR(应用无响应),这样用户就会很快地结束掉你的APP。
这个部分我会在之后的深入研究Android机制中进行更为详细的学习分析,这里做个标记~
异步消息处理
之所以会有异步消息处理机制,就我个人的理解,是由于耗时操作虽然可以新开一个线程来处理,不过如果处理的结果对UI更新这样的操作,就会阻塞主线程。
根据操作系统的知识,异步机制就意味着我们不用阻塞在那些耗时的操作上,只需要发出一个耗时操作的请求就可以做接下来的事情,这样,就不会发生进程的阻塞。等到耗时操作完成之后会用特定的方式来通知我们,已经完成
-
Android中的异步消息处理主要包括四个部分:
Message, Handler, MessageQueue, Looper
之前看的Android面试题目也有很多问道这部分的,足见重要性,继续说。
- handler : 是整个异步消息处理机制中的控制者,处理者。它负责发送和处理消息
- message : 主要是在不同的线程之间传递消息,作为一个消息的载体,其中的what字段等等,可以携带一定的数据信息。
- MessageQueue: 消息队列,整个程序可能有很多异步消息需要处理,但 是对于一个线程来说(主线程),只能有一个handler ,MessageQueue。所以我们需要把还没有处理的消息放入消息队列当中。
- looper:它相当于MessageQueue中的调度者,通过调用loop方法,进行一个无限循环,不断的从消息队列中取出消息,发送给handler进行处理。 上面的代码大家也看到了,我要做的是两件事,一个是要进行一个循环耗时操作,还有一个就是更新textview控件上面的内容。耗时操作是必须放在子线程中的,但是对UI的操作写到了一个handlemessage的函数中。
这张图片摘自郭霖大神的第一行代码第九章
这个部分我的理解还不够深刻,之后有空可以重新填一下这个坑
- 总结一下异步消息处理机制的过程。
- 首先需要在主线程中创建一个Handler对象,并重写handleMessage()方法。
当子线程中需要进行UI操作,就创建一个Message对象,并通过Handler将这条消息发送出去。
之后,指条消息就被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理的消息,最后分发回Handler的handlerMessage()方法。
由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,也就可以进行UI操作了。
使用AsyncTask
这个部分我先跳过,创新杯回来再写
Service
什么是服务
Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互。service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的。
Service的启动有两种方式:**context.startService() **和 context.bindService()这里放上
Google
给Service的定义
A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC). For example, a service might handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background.
15:20 这个部分先写到这里,先去写会儿代码