精华内容
下载资源
问答
  • 详细讲解了安卓网络通信安全机制,附带了文档,工具,源代码,详细讲解了服务器端和客户端的公钥私钥的生成
  • 安卓消息通信机制概述Handle+Message

    千次阅读 2017-03-13 12:49:54
    Android的消息机制 Message类 Handler类常用方法 Android的消息机制: 在Android中我们通常把UI页面所在的线程叫做主线程,如果主线程执行某一项耗时操作超过5秒钟, ... 比如加载网络图片,加载网络数据,

    Android的消息机制:

    在Android中我们通常把UI页面所在的线程叫做主线程,如果主线程执行某一项耗时操作超过5秒钟,
    程序将会报ANR(Application Not Responding)错误。但是开发者不可避免会进行耗时操作,
    比如加载网络图片,加载网络数据,读写大文件等等,此时我们通常会将耗时操作放在子线程中执行,
    子线程执行完成后将数据或者结果发送给主线程。
    这个时候就用到了Android的消息机制,即android间的通信。

    ① 消息队列(Message Queue)
    Android应用程序每启动一个线程,都为其创建一个消息队列,然后进入到一个无限循环之中。
    然后不断检查队列中是否有新消息需要处理。如果没有,线程就会进入睡眠状态,反之会对消息进行分发处理。
    ② 消息机制核心类
    android的消息处理有三个核心类:
    Looper,Handler和Message。
    (Message Queue(消息队列)被封装到Looper里面了,我们不会直接与Message Queue打交道,因此没将其作为核心类)
    消息(Message):存放在消息队列中,被Looper循环取出执行,消息可以携带数据,并指定操作
    Handler:可以往消息队列(MessageQueue)中存放消息
    Looper:无限循环地从消息队列中获取消息并执行

    Message类 :

                    android.os.Message的主要功能是进行消息的封装,并且同时可以指定消息的操作形式。
                            变量或方法                   类型  描述
                            *public int what            变量  用于定义此Message属于何种操作
                            *public Object obj          变量  用于定义此Message传递的信息数据
                            public int arg1             变量  传递一些整型数据时使用,一般很少使用
                            public int arg2             变量  传递一些整型数据时使用,一般很少使用
                            public Handler getTarget()  普通  取得操作此消息的Handler对象
    

    Handler类常用方法:

    Message对象封装了所有的消息,而这些消息的操作就需要android.os.Handler类完成
    

    方法 类型 描述
    public Handler() 构造 创建一个新的Handler实例
    public Handler(Looper looper) 构造 使用指定的队列创建一个新的Handler实例
    public final Message obtainMessage(int what, Object obj) 普通 获得一个Message对象
    public final Message obtainMessage(int what, int arg1, int arg2, Object obj) 普通 获得一个Message对象
    public void handleMessage(Message msg) 普通 处理消息的方法,子类要覆写此方法
    public final boolean hasMessages(int what) 普通 判断是否有指定的Message
    public final boolean hasMessages(int what, Object object) 普通 判断是否有指定的Message
    public final void removeMessages(int what) 普通 删除掉指定的Message
    public final void removeMessages(int what, Object object) 普通 删除掉指定的Message
    public final boolean sendEmptyMessage(int what) 普通 发送一个空消息
    public final boolean sendEmptyMessageAtTime(int what, long uptimeMillis) 普通 在指定的日期时间发送消息
    public final boolean sendEmptyMessageDelayed(int what, long delayMillis) 普通 等待指定的时间之后发送消息
    public final boolean sendMessage(Message msg) 普通 发送消息

    重点内容 使用Handle和Message的原因:
    ①。Handle可以处理耗时任务操作,而主线程不能进行耗时操作
    ②。子线程不能控制主线程操作数据,Message对象封装了所有消息,需要handle完成发送

    展开全文
  • 套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网 络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地 主机的 IP 地址,本地进程的协议端口,远...

    socket 概念
    套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网
    络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地
    主机的 IP 地址,本地进程的协议端口,远地主机的 IP 地址,远地进程的协议端口。
    为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与 TCP/IP 协议交互
    提供了套接字(Socket)接口。应 用层可以和传输层通过 Socket 接口,区分来自不同应用程
    序进程或网络连接的通信,实现数据传输的并发服务。
    建立 socket 连接
    建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket ,另一
    个运行于服务器端,称为 ServerSocket 。
    套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

    1. 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的
      状态,实时监控网络状态,等待客户端的连接请求。
    2. 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
      为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端- - 套接字的地址和端口号,然后就向服务器端套接字提出连接请求。 连接确认:当服
      务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接
      字的请求,建立一个新的线程,把服务器端套接字的描述发 给客户端,一旦客户端
      确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续
      接收其他客户端套接字的连接请求。
      SOCKET 连接与 TCP
      创建 Socket 连接时,可以指定使用的传输层协议,Socket 可以支持不同的传输层协议(TCP
      或 UDP),当使用 TCP 协议进行连接时,该 Socket 连接就是一个 TCP 连接。
      Socket 连接与 HTTP 连接
      由于通常情况下 Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通信双方即可开
      始相互发送数据内容,直到双方连接断开。但在实际网 络应用中,客户端到服务器之间的
      通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭
      长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连
      接处于活跃状态。
      HTTP 连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户
      端向服务器发出请求后,服务器端才能回复数据。
      很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步
      此时若双方建立的是 Socket 连接,服务器就可以直接将数 据传送给客户端;若双方建立的
      是 HTTP 连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,
      客户端定时向服务器端发送连接请求, 不仅可以保持在线,同时也是在“询问”服务器是否
      有新的数据,如果有就将数据传给客户端。TCP(Transmission Control Protocol) 传输控制
      协议

    socket 断线重连实现
    正常连接断开客户端会给服务端发送一个 fin 包,服务端收到 fin 包后才会知道连接断开。而
    断网断电时客户端无法发送 fin 包给服务端,所以服务端没办法检测到客户端已经短线。 为
    了缓解这个问题,服务端需要有个心跳逻辑,就是服务端检测到某个客户端多久没发送任何
    数据过来就认为客户端已经断开, 这需要客户端定时向服务端发送心跳数据维持连接。

    心跳机制实现
    长连接的实现:心跳机制,应用层协议大多都有 HeartBeat 机制,通常是客户端每隔一小段
    时间向服务器发送一个数据包,通知服务器自己仍然在线。并传输一些可能必要的数据。使
    用心跳包的典型协议是 IM,比如 QQ/MSN/飞信等协议
    1、在 TCP 的机制里面,本身是存在有心跳包的机制的,也就是 TCP 的选项:SO_KEEPALIVE。
    系统默认是设置的 2 小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断
    线。 而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
    通过使用 TCP 的 KeepAlive 机制(修改那个 time 参数),可以让连接每隔一小段时间就产
    生一些 ack 包,以降低被踢掉的风险,当然,这样的代价是额外的网络和 CPU 负担。
    2、应用层心跳机制实现。

    应用层心跳机制

    展开全文
  • 安卓消息机制

    2016-09-07 15:08:00
    安卓开发在处理不同线程通信的时候有一套消息处理机制安卓的主线程(UI线程)是不允许处理耗时任务的。所以一般耗时任务比如常见的网络下载等任务都是子线程完成,子线程完成之后通知主线程更新UI,利用Handler类...

      安卓开发在处理不同线程通信的时候有一套消息处理机制,安卓的主线程(UI线程)是不允许处理耗时任务的。所以一般耗时任务比如常见的网络下载等任务都是子线程完成,子线程完成之后通知主线程更新UI,利用Handler类实现不同线程之间的通信:

        

    1:实例化Message msg = mHandler.obtainMessage();

     public final Message obtainMessage()
        {
            return Message.obtain(this);//调用的是Message类中的obtain
        }

      Handler类中obtainMessage方法实际调用的还是Message的static方法obtain(Handler);

        public static Message obtain(Handler h) { //Message中obtain的源码
            Message m = obtain();//这里是Message获取消息队列中的消息
            m.target = h;//这里会传入想要获取Message的Handler,这样就会实现Message与Handler的绑定
                 //在Looper的循环中会调用Handler的dispatchMessage方法,而dispatchMessage
                 //调用的还是handleMessage(..);所以在处理异步通信的时候在主线程要重写handlerMessage
                 //方法来处理消息,通过what来确认消息标示
    return m; }

      这里传入了Handler与消息绑定起来,这这个方法最终调用的是重载的方法obtain();

    public static Message obtain() {
            synchronized (sPoolSync) {
                if (sPool != null) {
                    Message m = sPool;
                    sPool = m.next;
                    m.next = null;
                    m.flags = 0; // clear in-use flag
                    sPoolSize--;
                    return m;
                }
            }
            return new Message();
        }

       这里其实先在全局的消息池中,获取Message对象,其中sPool = m.next;类似于链表里的指针域(结构类似于)next其实是Message类定义的Message对象;如果消息池中有现成的对象,就只会取出,不用重新new,如果没有就返回一个
    新new的消息对象。

    2:获取消息对象之后用Handler(处理器)来发送消息

      mHandler.sendMessage(msg);看看源码

      public final boolean sendMessage(Message msg)
        {
            return sendMessageDelayed(msg, 0);
        }

    这里实际调用的是sendMessageDelayed(msg,0);这里不是延时发送消息,而是延时处理消息,只不过延时时间设定的是0;

    以上获取消息发送消息都是在子线程里处理的。在主线程中用Handler类处理消息

    3:Handler类的构造函数需要指定回调接口,Handler类有一个接口Callback中有一个handleMessage方法,在Handler中也有一个同名方法。

     public interface Callback {
            public boolean handleMessage(Message msg);
        }

    如果不指定回调接口就要重写方法:handleMessage();

    /**
         * Subclasses must implement this to receive messages.
         */
        public void handleMessage(Message msg) {
        }

    注释写得很清楚如果是用Handler的子类来处理消息就必须重写这个类类接受消息。
    另外也可以用匿名内部类的方式来重写接口Callback里的handleMessage;

     private Handler myHandler = new Handler(new Handler.Callback(){
            @Override
            public boolean handleMessage(Message msg) {
               
                return true;
            }
        });

    获得消息之后就可以做相应的处理。首先要更具Message的what属性来确定是否是自己需要的消息,这个可以在发送消息的时候指定。
    这里要明确Handler是如何处理消息的实际上是调用dispatchMessage();看源码

    /**
         * Handle system messages here.
         */
        public void dispatchMessage(Message msg) {
            if (msg.callback != null) {
                handleCallback(msg);//这里会有限处理Message指定的回调函数
            } else {
                if (mCallback != null) {
                    if (mCallback.handleMessage(msg)) {
                        return;
                    }
                }
                handleMessage(msg);
            }
        }

    这个方法首先会判断Message本身是否定义了回调,如果有,那么直接调用handlerCallback(msg);

     private static void handleCallback(Message message) {
            message.callback.run();
        }

    从代码可以看出最终调用的是Message调用的callback,而Message定义的callback字段实际上是Runnable接口,所以要调用run启动线程;
    也就是说可以通过消息来启动一个子线程;

    如果在实例化Message的时候没有指定回调就会判断mCallback是否实例化,mCallback是Handler定义的一个final CallBack接口字段。这个在

    Handler实例化的时候调用对应的构造函数来指定

    public Handler(Callback callback) {
            this(callback, false);
        }

    如果调用的是无参构造函数的话要么用匿名内部内指定Callback,要么自己定义个Handler的子类重写handleMessage()方法。

    dispatchMessage(..)也可以看出:1、如果Message实例化没有指定回调

                    2、如果没有重写Handler类的接口CallBack中的 boolean handleMessage()方法

                    3、最后才会执行Handler类中的方法void handlerMessage();

    转载于:https://www.cnblogs.com/ashitaka/p/5849559.html

    展开全文
  • 安卓handler机制

    2018-10-31 13:33:17
    安卓自从设计之初,为了避免主线程卡顿的问题,禁止在主线程种进行网络请求;禁止在子线程更新ui,避免UI错乱。为了子线程、主线程间通信,设计了handler机制。handler机制是面试必考的科目,考察求职者理解深度、...

         安卓自从设计之初,为了避免主线程卡顿的问题,禁止在主线程种进行网络请求;禁止在子线程更新ui,避免UI错乱。为了子线程、主线程间通信,设计了handler机制。handler机制是面试必考的科目,考察求职者理解深度、表达能力的,总结一下。

        借用的别人的图,表达的已经很详细了。

       补充一个阻塞式循环知识点:
    主线程的死循环一直运行是不是特别消耗CPU资源呢? 其实不然,这里就涉及到Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。这里采用的epoll机制,是一种IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的。 所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。
     

    展开全文
  • 1 Android系统概述  Android是Google公司开发的基于Linux平台开源的手机操作系统,... Android系统基于Linux 2.6内核来提供系统的核心服务,例如安全机制,内存管理,进程管理,网络堆栈和驱动模块。其包含一组核心
  • 自然可以考虑新建一个工作线程(Thread)来完成网络通信,那么问题又来了,譬如在完成了网络通信后往往需要更新UI,我们的网络通信是在子线程中完成的,而安卓的UI交互是在主线程中实现的!显然,我们无法在网络通信...
  • Handler的运行机制 Handler的作用: 当我们需要在子线程处理耗时的操作(例如访问网络,数据库的操作),而当耗时的操作完成后,需要更新UI,这就需要使用Handler来处理,因为子线程不能做更新UI的操作。Handler能...
  • 实际项目中常使用socket进行通信,我们可以使用第三方框架IOSocket进行网络socket通信,通常的写法是每一个监听都对应一个Linstener, 一旦协议多起来,代码量将是样当的大,很容易出错,思前想后,想到对IOSocket...
  • 文章目录零、学习目标一、Socket概述(一)两种传输模式(二)基于Socket网络编程三、案例演示 - C/S架构聊天室(一)运行效果(二)涉及知识点...Socket(套接字)是一种通信机制,可以实现单机或跨网络进行通信,其创
  • 之所以需要跨线程通信是因为在Android中主线程通常只负责UI的创建和修改,子线程负责网络访问和耗时操作,因此,主线程和子线程需要经常配合使用才能完成整个Android功能。Handler机制可以近似用图1展示.MainThread...
  • 场景重现: 当我们频繁需要网络耗时操作的时候,例如http请求json数据,由于安卓不允许主线程耗时操作的机制,导致我们每次请求数据的时候都需要开启子线程,并且还要考虑线程之间通信、同步、异步等问题。...
  • Java反射机制与框架原理

    千人学习 2019-03-19 22:49:50
    使用反射机制,读取类中的注解信息 * 以反射和注解为基础,演示数据库SQL的自动生成 * 注解的默认值,默认注解,元注解和内置注解 * 以全局实例管理为例,演示一般性的框架设计方法 三、课程体系 〖Java学习指南〗...
  • 安卓UDP通信UDP协议简介套接字socketUDP首部格式 UDP协议简介 UDP属于传输层协议,属于TCP/IP协议中的一部分,UDP是不具有可靠性的数据报协议,因此可以根据需要设定重传机制,适合高速传输和实时性有较高要求的...
  • 1、android中主线程与非主线程通信机制。 2、多线程的编程和管理。 3、android网络编程 4、自己设计实现设计模式-监听器模式 5、Activity、Service、数据库编程 6、android文件系统 7、缓存 博文地址:...
  • 《疯狂Android讲义(第2版)》内容覆盖了Android用户界面编程、Android四大组件、Android资源访问、图形/图像处理、事件处理机制、Android输入/输出处理、音频/视频多媒体应用开发、OpenGL与3D应用开发、网络通信...
  • 《疯狂Android讲义(第2版)》内容覆盖了Android用户界面编程、Android四大组件、Android资源访问、图形/图像处理、事件处理机制、Android输入/输出处理、音频/视频多媒体应用开发、OpenGL与3D应用开发、网络通信...
  • udt的java实现修改,对网上的源码进行修正,并且安卓TCP操作方式进行封装,同时封装了文件发送,给出了示例。进行了充分测试。如果网络环境特别差建议不要使用,没有重连机制,需要自己重连。
  • 在开始回答前,先简单概括性地说说Linux现有的所有进程间IPC方式: ...4. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络通信; 5. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他
  • 在开始回答前,先简单概括性地说说Linux现有的所有进程间IPC方式: ...4. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络通信; 5. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他
  • 在开始回答前,先简单概括性地说说Linux现有的所有进程间IPC方式: ...4. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络通信; 5. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他
  • 《疯狂Android讲义(第2版)》内容覆盖了Android用户界面编程、Android四大组件、Android资源访问、图形/图像处理、事件处理机制、Android输入/输出处理、音频/视频多媒体应用开发、OpenGL与3D应用开发、网络通信...
  • |--Activity不允许横竖屏切换 |--Activity常用小技巧 |--Activity按返回直接回到桌面 |--aidl之结合反射获取应用缓存大小等...|--通信之Application实现应用全局通信 |--重启adb |--隐式转换 页面 |--震动效果的实现
  • 在开始回答前,先简单概括性地说说Linux现有的所有进程间IPC方式: ...4. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络通信; 5. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他
  • Android Handler消息机制源码分析——第...因此多线程以及线程间通信在Android中显得更为重要了,而安卓SDK中也提供给我们很多的多线程机制,譬如:Handler,AsyncTask,以及基于这些机制而来的IntentService,AsyncSer
  • 一个基于中小型提炼的CS开发框架,覆盖计算机端,web端,手机端的全平台系统模版,在大多数的一对多的系统设计中会包含一些常用的重复的功能代码,例如网络通信机制,客户端版本控制,帐户控制管理,密码修改,公告...
  • java.net.UnknownServiceException: ...这个错误是在安卓P系统上当调用远程接口进行网络通信时报的错误。 这是因为新的保护机制对于仅使用安全通信的应用,Android 6.0 Marshmallow(API 级别 23)引入了两种机制...
  •  首先,接下来这段时间,重新学习安卓网络通信。了解几个主流的网络通信框架。还有数据处理之类的。 第二点  熟悉Android的基本知识,在此基础上学习Android的核心机制,还有开发的模块化。此外,需要熟悉...
  • 前言概要: 1,进大公司还是小公司,真的有的选? 2,校招的潜规则 3,校招想进大厂怎么办 ...熟悉UI/ NDK开发,掌握TCP/IP,HTTP网络通信机制,有OkHttp使用包装经验,熟悉安卓图形处理OpenGL ES机制,有Camera.

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

安卓网络通信机制