美文网首页
My Android Series[1]

My Android Series[1]

作者: Royno7 | 来源:发表于2016-03-25 15:20 被阅读36次

    开始前的话

    啃找到的那两本好书,有些收获。不过这周我时间是在太赶,下周的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的函数中。
    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]

          本文链接:https://www.haomeiwen.com/subject/bfmllttx.html