My Android Series[1]

开始前的话

啃找到的那两本好书,有些收获。不过这周我时间是在太赶,下周的My Android Series系列再开坑写那些安卓底层、开发技巧的东西。

这篇博文,我打算写写多线程、网络和蓝牙,一直以来自己对网络开发和多线程的掌握一直都不太好,也缺少开发实践;蓝牙则是这次写项目要用到,粗略看了下资料发现蓝牙和socket编程十分相似,所以也放到一块来说。

(好像这样的话一篇博文会特别长,我还是分成三篇来写吧——多线程+Service、网络、蓝牙)

Android中的多线程 及 Service(服务)

这里先说一下多线程和异步消息处理机制,因为Service是

Android 多线程 和 异步消息处理机制

多线程

andorid中的多线程和Java十分类似,语法都基本一样。

  1. 继承Thread
class MyThread extends Thread{
   @Override
   public void run(){
    //具体逻辑
   }
}

然后要用的时候 new一个MyThread实例,调用start()方法就ok

new MyThread().start();
  1. 实现Runnable
class MyThread implements Runnable{
   @Override
   public void run(){
    //具体逻辑
   }
}

启动线程的时候要改一下。使用Thread的构造函数接收一个Runnable参数,这里就是new出的MyThread对象;然后再调用Thread的start方法

MyThread myThread = new MyThread();
new Thread(myThread).start();
  1. anroid 中一些需要注意的东西
  • 无论何时启动APP,所有的组件都会运行在一个单独的线程中(默认的)——叫做主线程。这个线程主要用于处理UI的操作并为视图组件和小部件分发事件等,因此主线程也被称作UI线程。
  • 如果你在UI线程中运行一个耗时操作,那么UI就会被锁住,直到这个耗时操作结束。这是很不友好的用户体验设计,这就是为什么要把一些复杂的工作移动到其它的线程中去执行。如果你在UI线程中运行一个耗时的任务,那么很有可能会发生ANR(应用无响应),这样用户就会很快地结束掉你的APP。

这个部分我会在之后的深入研究Android机制中进行更为详细的学习分析,这里做个标记~

异步消息处理

之所以会有异步消息处理机制,就我个人的理解,是由于耗时操作虽然可以新开一个线程来处理,不过如果处理的结果对UI更新这样的操作,就会阻塞主线程。
根据操作系统的知识,异步机制就意味着我们不用阻塞在那些耗时的操作上,只需要发出一个耗时操作的请求就可以做接下来的事情,这样,就不会发生进程的阻塞。等到耗时操作完成之后会用特定的方式来通知我们,已经完成

  1. Android中的异步消息处理主要包括四个部分:
    Message, Handler, MessageQueue, Looper
    之前看的Android面试题目也有很多问道这部分的,足见重要性,继续说。
  • handler : 是整个异步消息处理机制中的控制者,处理者。它负责发送和处理消息
  • message : 主要是在不同的线程之间传递消息,作为一个消息的载体,其中的what字段等等,可以携带一定的数据信息。
  • MessageQueue: 消息队列,整个程序可能有很多异步消息需要处理,但 是对于一个线程来说(主线程),只能有一个handler ,MessageQueue。所以我们需要把还没有处理的消息放入消息队列当中。
  • looper:它相当于MessageQueue中的调度者,通过调用loop方法,进行一个无限循环,不断的从消息队列中取出消息,发送给handler进行处理。 上面的代码大家也看到了,我要做的是两件事,一个是要进行一个循环耗时操作,还有一个就是更新textview控件上面的内容。耗时操作是必须放在子线程中的,但是对UI的操作写到了一个handlemessage的函数中。
My Android Series[1]_第1张图片
Android_异步消息处理 .jpg

这张图片摘自郭霖大神的第一行代码第九章
这个部分我的理解还不够深刻,之后有空可以重新填一下这个坑

  1. 总结一下异步消息处理机制的过程。
  • 首先需要在主线程中创建一个Handler对象,并重写handleMessage()方法。
  1. 当子线程中需要进行UI操作,就创建一个Message对象,并通过Handler将这条消息发送出去。

  2. 之后,指条消息就被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理的消息,最后分发回Handler的handlerMessage()方法。

  3. 由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,也就可以进行UI操作了。

  4. 使用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 这个部分先写到这里,先去写会儿代码

你可能感兴趣的:(My Android Series[1])