精华内容
下载资源
问答
  • Handler有何作用?如何使用?

    千次阅读 2014-04-27 12:03:39
    android Handler有何作用?如何使用?


    一  Handler作用和概念 

        包含线程队列和消息队列,实现异步的消息处理机制,跟web开发的ajax有异曲同工之妙。 
          1.运行在某个线程上,共享线程的消息队列;  
          2.接收消息、调度消息,派发消息和处理消息;  
          3.实现消息的异步处理;
              Handler能够让你发送和处理消息,以及Runnable对象;每个Handler对象对应一个Thread和 Thread的消息队列。 当你创建一个Handler时,它就和Thread的消息队列绑定在一起,然后就可以 传递消息和runnable对象到消息队列中, 执行消息后就从消息队列中退出。

      Handler的作用就是:调度消息和runnable对象去被执行;使动作在不同的线程中被执行。

      当一个应用程序中进程被创建时,它的主线程专门运行消息队列(messageQueue),去管理顶层的应用程序相关的对象如:activity,broadcastReceiver,windows等,你可以创建你的Thread,和主线程进行交互——通过Handler,交互的方法就是通过post或者sendMessage。但是在你的新线程中,给定的Message或者Runnable,会在适当的时候的被调度和处理

    (即不会被立即处理——阻塞式)。

    实际上就是建立消息处理模型/系统

       要学习Handler,看到肯定是和消息有关,可能还是需要先熟悉一下消息系统的构成和简单原理。下面就先学习一下消息系统的基本原理。

    二 消息系统的基本原理和构成

           从一般的消息系统模型的建立大致构成以下几个部分:

        1. 消息原型

        2. 消息队列

        3. 发送消息

        4.消息循环

        5.消息获取

        6.消息派发

        7.消息处理

    大致模型图如下:

     

        

     消息系统模型一般会包括以上七个部分(消息原型,消息队列,消息发送,消息循环,消息获取,

    消息派发,消息处理)。实际上的核心是消息队列和消息循环,其余部分都是围绕这两部分进行的。

      从前面文档的分析中我们知道Handler就是用来建立消息处理的系统模型,那么和这里基本消息

    系统模型相比,那么Handler又是如何囊括这七个部分的呢?

      在Android中对这六个部分进行了抽象成四个独立的部分(消息循环):

        Handler,Message,MessageQueue,Looper;

    •   Message就是消息原型,包含消息描述和数据,
    •   MessageQueue就是消息队列
    •   Looper完成消息循环
    •   Handler就是驾驭整个消息系统模型,统领Message,MessgeQueue和Looper

      Handler能够实现消息系统模型,那么具体是如何进行工作的呢,下面探究一下这其中工作的方法和原理。

    三 Handler工作原理分析

      要了解Handler工作原理,先看一下这个系统模型具体组成的层次结构框架是个什么样的。

          


    1.Looper:

      实现Thread的消息循环和消息派发,缺省情况下Thread是没有这个消息循环的既没有Looper;

    需要主动去创建,然后启动Looper的消息循环loop;与外部的交互通过Handler进行;

    2.MessageQueue:

      消息队列,由Looper所持有,但是消息的添加是通过Handler进行;

      消息循环和消息队列都是属于Thread,而Handler本身并不具有Looper和MessageQueue;

    但是消息系统的建立和交互,是Thread将Looper和MessageQueue交给某个Handler维护建立消息系统模型。所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的,

    而建立Handler的关键就是这个Looper。

      一个Thread同时可以对应多个Handler,一个Handler同时只能属于一个Thread。Handler属于哪个

    Thread取决于Handler在那个Thread中建立。

      在一个Thread中Looper也是唯一的,一个Thread对应一个Looper,建立Handler的Looper来自哪个Thread,

    Handler属于哪个Thread。

      故建立Thread消息系统,就是将Thread的Looper交给Handler去打理,实现消息系统模型,完成消息的异步处理。

    Handler与Thread及Looper的关系可以用下面图来表示:

        

     

           Handler并不等于Thread,必须通过Thread的Looper及其MessageQueue,用来实现Thread消息系统模型,依附于Thread上。

    在线程建立Handler时:

      使Handler满足消息系统需要的条件,将Thread中的Looper和MessageQueue交给Handler来负责维护。

    在线程中建立Handler,需要做以下工作:

      1.  获取Thread中的Looper交给Handler的成员变量引用维护;

      2.  通过Looper获取MessageQueue交给Handler的成员变量引用维护。

      那么消息系统模型建立完成之后,按照消息系统运行,从Handler来看就是发送消息派发消息,与此线程消息系统的交互都由Handler完成。

    消息发送和派发接口:

      1.  post(runnable)消息,Runnable是消息回调,经过消息循环引发消息回调函数执行;

      2.  sendMessage(Message)消息,经过消息循环派发消息处理函数中处理消息;

      3.  dispatchMessage       派发消息,若是post或带有回调函数则执行回调函数,否则执行

          消息处理函数Handler的handleMessage(通常派生类重写)。

     以上就是Handler如何实现Thread消息系统模型的大致介绍。下面将具体分析是如何实现消息系统模型运行的。

    四 Handler实现流程分析

      我们知道Handler就是一个消息系统的外壳,属于某个Thread并包装了Thread的Looper及其MessageQueue;与外部进行交互(同一个线程内或者线程之间),接收派发和处理消息,消息系统模型的核心是Looper。

      下面看看Handler是如何建立跑起来的,以msg消息为例,runnable实质是一样。

    1 Handler的建立

      Handler唯一属于某个Thread,在某个Thread中建立Handler时,需要获取Thread的Looper

    及其MessageQueue,建立Handler关键是Looper的来源。

      Handler提供了好几个构造函数但其本质一致:由外部传入Looper:当前线程或其他线程    

      public Handler(Looper looper) {
            //初始化构建消息系统参数 mLooper
    = looper; mQueue = looper.mQueue; mCallback = null
    ;   }

    从当前线程获取:由创建Handler的Thread决定

           

    复制代码
      public Handler() {
            //初始化构建消息系统参数 mLooper
    = Looper.myLooper(); mQueue = mLooper.mQueue; mCallback = null;   }   public static Looper myLooper() { return sThreadLocal.get(); }
    复制代码

     不管哪种方式,我们知道Thread在默认情况下是没有建立消息循环Looper实例的。要实现消息循环必须确保Thread的Looper建立。如何确保呢?

    Looper提供了静态函数:

    复制代码
    public static void prepare() {
         if (sThreadLocal.get() != null) {
                  throw new RuntimeException("Only one Looper may be created per thread");
         }
    
         sThreadLocal.set(new Looper());
    }
    
    //存储线程的局部变量
    static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
    复制代码

    看到这里刚开始让我很是奇怪和迷惑:

         Looper一个独立的类,又不属于某个Thread,而这里创建Looper的函数又是静态的,

    属于整个Looper类;创建Looper之后交给静态成员变量sThreadLocal保存,获取

    sThreadLocal.get(),那么一个静态变量属于整个类,属性更改始终有效。一次创建之后

    sThreadLocal.get()永远都不等于null!


      而Thread和Looper是唯一对应的,那这里岂不是所有的Thread都是用同一个Looper,不可能!所以肯定这个ThreadLocal是有玄机的。网上一查:

      ThreadLocal:

        维护线程的变量,为每个使用该变量的线程实例提供独立的变量副本,每个线程都能够独立使用该变量,而互不影响。(详细可参考:http://blog.csdn.net/qjyong/article/details/2158097

      所以每一个线程调用Looper.prepare时,都会创建为其唯一的Looper。要建立Handler,需要先创建线程的Looper,才能建立消息系统模型。通过Looper我们建立了Thread上的消息系统模型Handler,可以来进行消息系统的一系列流程了。

    2 消息发送

    消息发送两种方式:post和sendMessage;

           post:针对runnable对象;Runnable是一个接口,就是一个回调函数(提供了run方法)

           sendMessage:针对Message对象;

           下面通过代码具体看一下这个过程:

    复制代码
    public final boolean post(Runnable r){
           return  sendMessageDelayed(getPostMessage(r), 0);
    }
    
    public final boolean sendMessage(Message msg){
        return sendMessageDelayed(msg, 0);
    }
    复制代码

     

      看到post和sendMessage发送消息时,仅仅是对象不同而已,Runnable和Message;但实际上都是Message的形式来描述。

    这跟我通常理解的消息机制不同:

      通常post消息是将消息加入到消息队列中并不立即执行就返回,send消息是立即执行等待消息执行完才返回。而这里post或者send都是将消息放入到消息队列中,然后立即返回,等待消息循环时获取消息被执行。

      这里提供了众多的消息发送方法来指定消息的执行时间和顺序,具体可以查看源代码。

    消息执行顺序是根据消息队列中消息的排列顺序而定。下面看一下发送消息后将消息加入到消息队列中的代码:

    由Handler调用MessageQueue的enqueueMessage方法:

           

    复制代码
      final boolean enqueueMessage(Message msg, long when) {
    
                  Message p = mMessages;
    
                  if (p == null || when == 0 || when < p.when) {
                     msg.next = p;
                     mMessages = msg;
                  }
                  else {
    Message prev
    = null; while (p != null && p.when <= when) { prev = p; p = p.next; } msg.next = prev.next; prev.next = msg; } ……   }
    复制代码

      可以看到是按照时间顺序将消息加入到MessageQueue中;

    现在将消息加入到消息队列中存储起来,消息并未得到处理,下一步必然是如何派发消息和处理消息。

    3 消息派发

    建立Thread消息循环由Looper完成,存在一个消息调度死循环:    

    复制代码
      public static void loop() {
           MessageQueue queue = me.mQueue;
           while (true) {
                  Message msg = queue.next(); // might block
                  if (msg != null) {
                         if (msg.target == null) {
                                // No target is a magic identifier for the quit message.
                                return;
                         }
    
                         //派发消息 到target(Handler)
                msg.target.dispatchMessage(msg);
    
                //回收Msg到msgPool
                         msg.recycle();
                  }
           }
      }
    复制代码


      这里看到消息派发是由Message的target完成,这个target是什么呢?是一个Handler。消息系统是通过Handler用来与外部交互,把消息派发出去。可以看到没有这个Handler,消息循环将结束。

    消息派发由Looper通过Handler完成:

    复制代码
      public void dispatchMessage(Message msg) {
    
           //首先判断runnable对象
           if (msg.callback != null) {
                  handleCallback(msg);
           }
           else {
                  //整个消息系统的回调函数 可以不用实现自己Handler
                  if (mCallback != null) {
                         if (mCallback.handleMessage(msg)) {
                                return;
                         }
                  }
    //消息处理 通常交给Handler派生类 handleMessage(msg); }   }
    复制代码

      通过消息派发,这样就实现消息的异步处理。

    4 消息原型

    前面看到消息发送有两种方式:

      post(Runnable对象),sendMessage(Message对象),而中间都是通过Message对象

    保存在MessageQueue中。然后消息派发时处理方式不同。如果在sendMessage时将将消息对象附上Runnable对象,则post和sendMessage没有区别了。所以这两种方式很好理解基本一致,处理的方式不同罢了。

      消息系统模型中,我们的真正的消息原型是什么,都具有那些功能,下面看一下Message中到底包含了那些东西,能有效帮助我们合理的运用消息系统来完成一些任务和处理。

    Message消息原型:

    复制代码
      public final class Message implements Parcelable {
             //标识消息
             public int what;
             int flags;
             long when;
          
             //传递简单数据
             public int arg1;
             public int arg2;
        
             //传递较复杂数据 对象
             public Object obj;
             Bundle data;
    
             //处理消息的目标Handler
             Handler target;   
    
             //消息派发时 执行的Runnable对象
             Runnable callback;  
    
             //使消息形成链表
             Message next;
    
             //建立一个消息pool,回收msg,以避免重复创建节约开销
             private static Message sPool;
             private static int sPoolSize = 0;
             private static final int MAX_POOL_SIZE = 10;
      }  
    复制代码

      看到提供了很丰富的属性来描述消息,针对具体问题选择使用那些属性去怎么样描述消息了。获取新的Message对象时,Message提供了obtain方法:避免我们自己去分配Message新的对象,通过obtain获取,可能从MessagePool中获取,节约开销。

    下面看一下这个MessagePool是如何建立的:

      通常消息处理完毕的时候,消息也基本上处于无用状态可以释放回收了。对于需要频繁的创建释放的对象来说,创建和释放类实例都是要开销的,太频繁的使开销增大不好,像Message这种很有可能会频繁的创建。于是我们可以将创建的对象用完之后保存在一个Pool里面,以便再重复利用节约频繁创建释放开销。是如何建立的呢?必然是在消息处理完毕之后才能进行。

    MessagePool建立:

    复制代码
    public static void loop() {
           while (true) {
                  //派发消息
                  msg.target.dispatchMessage(msg);
    
                  //消息处理完毕 回收
            msg.recycle();
        }
    }     
    
    public void recycle() {
           //回收Message 建立全局的MessagePool
           if (sPoolSize < MAX_POOL_SIZE) {
               next = sPool;
               sPool = this;
               sPoolSize++;
           }
    }
    复制代码

    五 Handler的应用

      以上这就是整个Handler作用及消息系统模型的建立。

    使用也非常简单,虽然有很多方式,但只要理解Handler是建立在Looper上,实现Thread的消息系统处理模型,实现消息异步处理,我想对与Handler基本应用上没有什么不能理解的了。其他方面可以去看源码了。

      Handler使用起来是非常简单的,关键就是如何利用消息的异步处理,来合理的完成我们需要功能和任务。对于一个Thread,我们使用好几个Handler来进行异步处理,也可以创建新的Thread,通过Handler来实现消息异步处理等等,应用场景很多如何用的好用的合理,这就没什么经验了。

    展开全文
  • Android中Handler有何作用?如何使用?

    千次阅读 2016-07-21 09:46:33
    一 Handler作用和概念 包含线程队列和消息队列,实现异步的消息处理机制,跟web开发的ajax异曲同工之妙。 运行在某个线程上,共享线程的消息队列;接收消息、调度消息,派发消息和处理消息;实现消息的...

    一  Handler作用和概念

    包含线程队列和消息队列,实现异步的消息处理机制,跟web开发的ajax有异曲同工之妙。
    1. 运行在某个线程上,共享线程的消息队列;
    2. 接收消息、调度消息,派发消息和处理消息;
    3. 实现消息的异步处理;

    Handler能够让你发送和处理消息,以及Runnable对象;每个Handler对象对应一个Thread和Thread的消息队列。当你创建一个Handler时,它就和Thread的消息队列绑定在一起,然后就可以传递消息和runnable对象到消息队列中,执行消息后就从消息队列中退出。

    Handler的作用就是:调度消息和runnable对象去被执行;使动作在不同的线程中被执行。

    当一个应用程序中进程被创建时,它的主线程专门运行消息队列(messageQueue),去管理顶层的应用程序相关的对象如:activity,broadcastReceiver,windows等,你可以创建你的Thread,和主线程进行交互——通过Handler,交互的方法就是通过post或者sendMessage。但是在你的新线程中,给定的Message或者Runnable,会在适当的时候的被调度和处理。

    (即不会被立即处理——阻塞式)。

    实际上就是建立消息处理模型/系统

    要学习Handler,看到肯定是和消息有关,可能还是需要先熟悉一下消息系统的构成和简单原理。

    下面就先学习一下消息系统的基本原理。

    二 消息系统的基本原理和构成

    从一般的消息系统模型的建立大致构成以下几个部分:

    • 消息原型
    • 消息队列
    • 发送消息
    • 消息循环
    • 消息获取
    • 消息派发
    • 消息处理

    大致模型图如下:

    消息系统模型一般会包括以上七个部分(消息原型,消息队列,消息发送,消息循环,消息获取,消息派发,消息处理)。实际上的核心是消息队列和消息循环,其余部分都是围绕这两部分进行的。

    从前面文档的分析中我们知道Handler就是用来建立消息处理的系统模型,那么和这里基本消息系统模型相比,那么Handler又是如何囊括这七个部分的呢?

    在Android中对这六个部分进行了抽象成四个独立的部分(消息循环):

    Handler,Message,MessageQueue,Looper;

    • Message就是消息原型,包含消息描述和数据,
    • MessageQueue就是消息队列,
    • Looper完成消息循环 ,
    • Handler就是驾驭整个消息系统模型,统领Message,MessgeQueue和Looper;

    Handler能够实现消息系统模型,那么具体是如何进行工作的呢,下面探究一下这其中工作的方法和原理。

    三 Handler工作原理分析

    要了解Handler工作原理,先看一下这个系统模型具体组成的层次结构框架是个什么样的。

    1,Looper:

    实现Thread的消息循环和消息派发,缺省情况下Thread是没有这个消息循环的,即没有Looper;

    需要主动去创建,然后启动Looper的消息循环loop;与外部的交互通过Handler进行;

    2,MessageQueue:

    消息队列,由Looper所持有,但是消息的添加是通过Handler进行;

    消息循环和消息队列都是属于Thread,而Handler本身并不具有Looper和MessageQueue;

    但是消息系统的建立和交互,是Thread将Looper和MessageQueue交给某个Handler维护建立消息系统模型。所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的,而建立Handler的关键就是这个Looper。

    一个Thread同时可以对应多个Handler,一个Handler同时只能属于一个Thread。Handler属于哪个Thread取决于Handler在那个Thread中建立。

    在一个Thread中Looper也是唯一的,一个Thread对应一个Looper,建立Handler的Looper来自哪个Thread,Handler属于哪个Thread。

    故建立Thread消息系统,就是将Thread的Looper交给Handler去打理,实现消息系统模型,完成消息的异步处理。

    Handler与Thread及Looper的关系可以用下面图来表示:

    Handler并不等于Thread,必须通过Thread的Looper及其MessageQueue,用来实现Thread消息系统模型,依附于Thread上。

    在线程建立Handler时:

    使Handler满足消息系统需要的条件,将Thread中的Looper和MessageQueue交给Handler来负责维护。

    在线程中建立Handler,需要做以下工作:

    1. 获取Thread中的Looper交给Handler的成员变量引用维护;
    2. 通过Looper获取MessageQueue交给Handler的成员变量引用维护。

    那么消息系统模型建立完成之后,按照消息系统运行,从Handler来看就是发送消息派发消息,与此线程消息系统的交互都由Handler完成。

    消息发送和派发接口:

    1. post(runnable)消息,Runnable是消息回调,经过消息循环引发消息回调函数执行;
    2. sendMessage(Message)消息,经过消息循环派发消息处理函数中处理消息;
    3. dispatchMessage派发消息,若是post或带有回调函数则执行回调函数,否则执行消息处理函数Handler的handleMessage(通常派生类重写)。

    以上就是Handler如何实现Thread消息系统模型的大致介绍。下面将具体分析是如何实现消息系统模型运行的。

    四 Handler实现流程分析

    我们知道Handler就是一个消息系统的外壳,属于某个Thread并包装了Thread的Looper及其MessageQueue;与外部进行交互(同一个线程内或者线程之间),接收派发和处理消息,消息系统模型的核心是Looper。

    下面看看Handler是如何建立跑起来的,以msg消息为例,runnable实质是一样。

    1,Handler的建立

    Handler唯一属于某个Thread,在某个Thread中建立Handler时,需要获取Thread的Looper及其MessageQueue,建立Handler关键是Looper的来源。

    Handler提供了好几个构造函数但其本质一致:由外部传入Looper:当前线程或其他线程

      public Handler(Looper looper) {
            //初始化构建消息系统参数
                  mLooper = looper;
                  mQueue = looper.mQueue;
                  mCallback = null;
      }

    从当前线程获取:由创建Handler的Thread决定

      public Handler() {
            //初始化构建消息系统参数
                  mLooper = Looper.myLooper();
                  mQueue = mLooper.mQueue;
                  mCallback = null;
      }
    
      public static Looper myLooper() {
            return sThreadLocal.get();
        }

    不管哪种方式,我们知道Thread在默认情况下是没有建立消息循环Looper实例的。要实现消息循环必须确保Thread的Looper建立。如何确保呢?

    Looper提供了静态函数:

    public static void prepare() {
         if (sThreadLocal.get() != null) {
                  throw new RuntimeException("Only one Looper may be created per thread");
         }
    
         sThreadLocal.set(new Looper());
    }
    
    //存储线程的局部变量
    static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

    看到这里刚开始让我很是奇怪和迷惑:

    Looper一个独立的类,又不属于某个Thread,而这里创建Looper的函数又是静态的,属于整个Looper类;创建Looper之后交给静态成员变量sThreadLocal保存,获取sThreadLocal.get(),那么一个静态变量属于整个类,属性更改始终有效。一次创建之后

    sThreadLocal.get()永远都不等于null!

    而Thread和Looper是唯一对应的,那这里岂不是所有的Thread都是用同一个Looper,不可能!所以肯定这个ThreadLocal是有玄机的。网上一查:

    ThreadLocal:

    维护线程的变量,为每个使用该变量的线程实例提供独立的变量副本,每个线程都能够独立使用该变量,而互不影响。(详细可参考:http://blog.csdn.net/qjyong/article/details/2158097

    所以每一个线程调用Looper.prepare时,都会创建为其唯一的Looper。要建立Handler,需要先创建线程的Looper,才能建立消息系统模型。通过Looper我们建立了Thread上的消息系统模型Handler,可以来进行消息系统的一系列流程了。

    2,消息发送

    消息发送两种方式:post和sendMessage;

    • post:针对runnable对象;Runnable是一个接口,就是一个回调函数(提供了run方法)
    • sendMessage:针对Message对象;

    下面通过代码具体看一下这个过程:

    public final boolean post(Runnable r){
           return  sendMessageDelayed(getPostMessage(r), 0);
    }
    
    public final boolean sendMessage(Message msg){
        return sendMessageDelayed(msg, 0);
    }

    看到post和sendMessage发送消息时,仅仅是对象不同而已,Runnable和Message;但实际上都是Message的形式来描述。

    这跟我通常理解的消息机制不同:

    通常post消息是将消息加入到消息队列中并不立即执行就返回,send消息是立即执行等待消息执行完才返回。而这里post或者send都是将消息放入到消息队列中,然后立即返回,等待消息循环时获取消息被执行。

    这里提供了众多的消息发送方法来指定消息的执行时间和顺序,具体可以查看源代码。

    消息执行顺序是根据消息队列中消息的排列顺序而定。下面看一下发送消息后将消息加入到消息队列中的代码:

    由Handler调用MessageQueue的enqueueMessage方法:

      final boolean enqueueMessage(Message msg, long when) {
    
                  Message p = mMessages;
    
                  if (p == null || when == 0 || when < p.when) {
                         msg.next = p;
                         mMessages = msg;
                  }
                  else {
                         Message prev = null;
                         while (p != null && p.when <= when) {
                                prev = p;
                                p = p.next;
                         }
    
                         msg.next = prev.next;
                         prev.next = msg;
                  }
                  ……
      }

    可以看到是按照时间顺序将消息加入到MessageQueue中;

    现在将消息加入到消息队列中存储起来,消息并未得到处理,下一步必然是如何派发消息和处理消息。

    3,消息派发

    建立Thread消息循环由Looper完成,存在一个消息调度死循环:

      public static void loop() {
           MessageQueue queue = me.mQueue;
           while (true) {
                  Message msg = queue.next(); // might block
                  if (msg != null) {
                         if (msg.target == null) {
                                // No target is a magic identifier for the quit message.
                                return;
                         }
    
                         //派发消息 到target(Handler)
                msg.target.dispatchMessage(msg);
    
                //回收Msg到msgPool
                         msg.recycle();
                  }
           }
      }

    这里看到消息派发是由Message的target完成,这个target是什么呢?是一个Handler。消息系统是通过Handler用来与外部交互,把消息派发出去。可以看到没有这个Handler,消息循环将结束。

    消息派发由Looper通过Handler完成:

      public void dispatchMessage(Message msg) {
    
           //首先判断runnable对象
           if (msg.callback != null) {
                  handleCallback(msg);
           }
           else {
                  //整个消息系统的回调函数 可以不用实现自己Handler
                  if (mCallback != null) {
                         if (mCallback.handleMessage(msg)) {
                                return;
                         }
                  }
                  //消息处理 通常交给Handler派生类
                  handleMessage(msg);
           }
      }

    通过消息派发,这样就实现消息的异步处理。

    4,消息原型

    前面看到消息发送有两种方式:

    post(Runnable对象),sendMessage(Message对象),而中间都是通过Message对象

    保存在MessageQueue中。然后消息派发时处理方式不同。如果在sendMessage时将将消息对象附上Runnable对象,则post和sendMessage没有区别了。所以这两种方式很好理解基本一致,处理的方式不同罢了。

    消息系统模型中,我们的真正的消息原型是什么,都具有那些功能,下面看一下Message中到底包含了那些东西,能有效帮助我们合理的运用消息系统来完成一些任务和处理。

    Message消息原型:

      public final class Message implements Parcelable {
             //标识消息
             public int what;
             int flags;
             long when;
    
             //传递简单数据
             public int arg1;
             public int arg2;
    
             //传递较复杂数据 对象
             public Object obj;
             Bundle data;
    
             //处理消息的目标Handler
             Handler target;   
    
             //消息派发时 执行的Runnable对象
             Runnable callback;  
    
             //使消息形成链表
             Message next;
    
             //建立一个消息pool,回收msg,以避免重复创建节约开销
             private static Message sPool;
             private static int sPoolSize = 0;
             private static final int MAX_POOL_SIZE = 10;
      }

    看到提供了很丰富的属性来描述消息,针对具体问题选择使用那些属性去怎么样描述消息了。获取新的Message对象时,Message提供了obtain方法:避免我们自己去分配Message新的对象,通过obtain获取,可能从MessagePool中获取,节约开销。

    下面看一下这个MessagePool是如何建立的:

    通常消息处理完毕的时候,消息也基本上处于无用状态可以释放回收了。对于需要频繁的创建释放的对象来说,创建和释放类实例都是要开销的,太频繁的使开销增大不好,像Message这种很有可能会频繁的创建。于是我们可以将创建的对象用完之后保存在一个Pool里面,以便再重复利用节约频繁创建释放开销。是如何建立的呢?必然是在消息处理完毕之后才能进行。

    MessagePool建立:

    public static void loop() {
           while (true) {
                  //派发消息
                  msg.target.dispatchMessage(msg);
    
                  //消息处理完毕 回收
            msg.recycle();
        }
    }     
    
    public void recycle() {
           //回收Message 建立全局的MessagePool
           if (sPoolSize < MAX_POOL_SIZE) {
               next = sPool;
               sPool = this;
               sPoolSize++;
           }
    }

    五 Handler的应用

    以上这就是整个Handler作用及消息系统模型的建立。

    使用也非常简单,虽然有很多方式,但只要理解Handler是建立在Looper上,实现Thread的消息系统处理模型,实现消息异步处理,我想对与Handler基本应用上没有什么不能理解的了。其他方面可以去看源码了。

    Handler使用起来是非常简单的,关键就是如何利用消息的异步处理,来合理的完成我们需要功能和任务。对于一个Thread,我们使用好几个Handler来进行异步处理,也可以创建新的Thread,通过Handler来实现消息异步处理等等,应用场景很多如何用的好用的合理,这就没什么经验了。

    转载请注明:Android开发中文站 » Handler有何作用?如何使用?

    展开全文
  • 2.包装有何作用 2.1 提供了一系列实用的方法2.2集合不允许存放基本数据类型数据,存放数字时,要用包装类型 3.包装类的构造方法3.1所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例 public Type...

    这里写图片描述
    1. 包装类把基本类型数据转换为对象

      1.1每个基本类型在java.lang包中都有一个相应的包装类
    

    2.包装类有何作用

     2.1 提供了一系列实用的方法
    
    
    
    2.2集合不允许存放基本数据类型数据,存放数字时,要用包装类型
    

    3.包装类的构造方法

    3.1所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例

      public  Type(type  value)
    
    
    
      如:Integer i=new Integer(1);
    

    3.2除Character类外,其他包装类可将一个字符串作为参数构造它们的实例

      public  Type(String  value)
    
    
    
      如:Integer i=new Integer("123");
    

    3.3 注意事项:

     (1)Boolean类构造方法参数为String类型时,若该字符串内容为
    
    
    
        true(不考虑大小写),则该Boolean对象表示true,否则表示false。
    
    
    
     (2)当Number包装类构造方法参数为String 类型时,字符串不能为null,
    
    
    
        且该字符串必须可解析为相应的基本数据类型的数据,否则编译通过,运行时NumberFormatException异常。
    

    文字部分内容,来自于此处。

    展开全文
  • 企业的每个岗位都其标准的晋升机制和等级要求,只不过大企业把它标准化和书面化,而一些小企业则没有这样的要求。但是不可否认的是,每个职责岗位都其晋升通道,岗位不同,其要求的能力素质也不太一样。 就比如...

    企业的每个岗位都有其标准的晋升机制和等级要求,只不过大企业把它标准化和书面化,而一些小企业则没有这样的要求。但是不可否认的是,每个职责岗位都有其晋升通道,岗位不同,其要求的能力素质也不太一样。

    就比如,腾讯的产品项目(内部成为P族)的内部晋升模型,从P1—P6,分为初作者、有经验者、骨干、专家、资深专家,然后每个等级又分为3个子等级,所以腾讯的分级也是极为严谨。晋升厚度很大,想要从初学者到资深专家,估计也得花比较长的时间。这是较为成熟的晋升体系,这也是建立在企业文化深厚底蕴,最重要的是得益于本身职位在历史长河中的发展较为充分,所以这个晋升体系也是比较完善。

    腾讯P族的等级能力要求

    但是作为产品运营,一个还在拓荒期的岗位,其晋升也是来的较为野蛮。小宇哥就是个典型的例子,从进入运营行业,就在没人带没人教的情况下,硬是闯出了一条血路。那时候运营也是叫的比较少,多是叫策划或者网络编辑、推广等称呼。近几年,运营这个称呼也开始慢慢被大众所接受,特别是近两年,运营多次被提起并重视,也是作为运营人的福音。

    在这种情况下,很多刚进入运营行业的小伙伴,比较关心的一个话题就是关于晋升渠道,现在网络上也贴出关于运营具体的晋升渠道:

    新媒体编辑——新媒体运营——资深 / 高级新媒体运营——新媒体运营主管 / 经理——新媒体运营总监——运营总监——CXO/CMO/COO

    这里对应的每一个岗位等级,能力要求也不一样。但是有些人做了3-5年,还是中级运营或者处在运营主管的位置就不会再上升了,而有些人年纪轻轻就坐上了运营总监甚至CMO/COO的位置了。

    为什么呢?这也是在网上被问得很火的一个问题:

    高级运营和初级运营的区别在哪里?

    但是我今天把运营等级分为了初级、中级、高级、顶级四个等级,而每一个等级对于的岗位要求能力以及现在从事的人数也不尽相同。今天我们就来说说这四者之间有什么不同?进而导致“同人不同命”的。

    运营的四个等级

    • 第一层,初级运营,现在的技能磨练是以后的根本
    • 第二层,中级运营,以方法论作指导,do right thing
    • 第三层,高级运营,运用丰富的资源整合把事情做得更好
    • 第四层,顶级运营,运筹帷幄之中 决胜千里之外

    第一层,初级运营,现在的技能磨练是以后的根本

    企业的一个岗位都有其要求,讲得就是技能,或高或低不同,产品运营岗位也不列外。我们都知道,现在进入运营行业的小伙伴也是从学会最基本的技能开始,如果里面的技能素质都不懂,你连初级运营都不是。

    在我刚进入运营行业时,从最底层的运营推广开始。产品推广中的SEO、SEM、软文写作、编辑器使用,排版等等,这是现在新媒体运营编辑的每天都会接触,可能现在在大企业里运营岗位分得较为垂直,编辑只是做“双微”的推送,并不会涉及SEO等推广的技能。但是这都算是运营的必备硬技能之一。

    我们这里又会把技能分为:硬技能和软技能

    硬技能指的是外在的技能,就是大家都能看见的,比如我们使用某个数据分析的工具、编辑使用的编辑器、又或者你使用Photoshop、excel等工具,这些都是大家可以看得到的,也是一个人别伯乐发现最好展现途径。

    软技能主要指的就是一个人的内在涵养,比如的谈吐、沟通技能、人际交往能力、团队协作能力等等都是你的软技能,虽然看不见,但是却又不得不修炼的技能。

    为什么这些技能显得重要?

    应届毕业生或者从产品、销售、技术转岗过来的新人,基本上对运营只是停留在概念上,而没有过多关于如何做或者为什么这些较为深层次的问题,唯有的就是先练好自己的技能,就是懂得这些好的爆品服务都是通过某些工具去实现的,这时我就得先去熟悉这些技能。而且这些技能也是运营入门必备的能力。

    拿我们新媒体编辑,如果你作为运营负责人,这时你要招一个新媒体编辑,这个新媒体编辑要么就是在校大学生,要么就是从别的岗位转过来的小伙伴。你招进来之后,你得培训他,这个培训不是特指的是公司业务层面的培训,而是主要在在技能上的培训。因为他要做一些推广运营的工作,比如微信公众号的运营、微博的推广或者APP内容的运营等等,这时你就得培养他们后台的使用、编辑器的使用、排版等等。

    很多人可能会觉得说,APP后台的使用、编辑的排版这些基本很多人都会,即使没接触过,培训不用很长时间也很快就能上手。说这句话的人可能只是看到的只是眼前的或者是狭隘的,而没有想到更久以后的或者更广的。我敢说产品运营的技能提升是一个贯穿于运营人整个职业生涯的,古人都有说:活到老学到老。我们要的不只是眼前的浅技能,产品运营要学的东西也不只是停留运营领域的,而是会设计市场、商务、技术、产品等等方面的技能。

    因此,在刚进入运营这个行业的时候,切莫着急一步登天,先静下心来磨练好你的运营技能,知道什么是运营的核心技能,什么是自己不擅长或者不会的,这将会对你接下来的运营生涯有非常大的帮助。

    第二层,中级运营,以方法论作指导,do right thing

    初级运营只是会用这些技能工具来执行很多事情,最起码对于编辑来说就这样,比如我看到很多小编就是为了做而做,我只是会去找授权文章,然后在编辑器里面修修改改,上司审核通过就可以推送了,心想着轻轻松松又一天,日复一日,这样做对自身并没有太多的帮助,而只是一个文字的搬运工。

    在我们掌握了一些基本的技能之后,接下来你要做的就是运用方法论去使自己会的东西发挥更大的作用。我们听说过这样的一句话:事半功倍,指的就是在做任何事情,方法是无比重要,如果方法不对,就会变成“事倍功半”。可见,有方法比胡做更有效率。

    我们拿活动运营举例子,活动运营是运营的三架马车之一,对产品拉新促活起着关键的作用。

    比如我们在做一个活动时第一步,应该紧紧围绕目标出发

    为什么要做这个活动,目的是什么,这是最重要的。

    大家接到活动运营任务的时候,往往就想着怎么去完成,往往忽略去问为什么?大家可能觉得问为什么没有必要,其实不然。多为什么帮助你去思考做好活动的必然过程。为什么要做这次活动?活动目的是为了什么?你知道了活动的目的之后,便于帮助你更好确定活动运营内容。比如,你现在手上接到要做一个活动任务,这个任务希望促销某种商品。当你了解到其实促销这种商品的主要目的是为了提升用户活跃量,那你会更加把活动内容和方向朝活跃老用户靠拢。那么这次活动效果会更好。

    而最理想的状况是把目的转化成一项数据,比如app希望提升用户规模,这是目的,转化为数据就是提升DAU。所以提升DAU就是活动目的。活动目的是策划活动的起点,是思考的源头。把握好这点,我们在后续的步骤中就不会偏离初衷。

    第二步,活动时间很重要

    很多时间节点不光非常有利活动借势宣传,而且经常能成为做活动的理由。传统的线下活动喜欢选择店庆、节假日、换季开展;而移动互联网优势给了线上活动更多的玩法和选择,不光是店庆、节假日、换季,一次热点事件都能成为很好的选择。另外,活动的起止时间也要有大概的范围。急于拿到活动效果的情况,活动就必须尽快上线;如果不是,那就可以有选择的余地。因为活动如果可以借势,就会事半功倍,这个“势”就是时间点。

    那我们除了在选择好的时间除外,还应该避开某些时间,就比如阿里巴巴的双十一,如果叫你跟阿里巴巴的双十一碰上,那你还不是死路一条,所以这些势头太过于凶猛都已经成为全民节日的,尽量避开,否则做了也是浪费钱。类似这些节日的还有京东的618、阿里的双十二等等。

    第三步,你要确定这个活动怎么玩才能吸引到用户的眼球!

    好玩能吸引到用户眼球的活动必定尊徐2个原则:简单和有创意的!

    1.简单,很多时候我们在活动策划时如果没注意就会陷入自我思维,源于对自己的产品过于熟悉,使得所有动作都变得理所当然,从而忽视一个活动初次参与者的心理。个人的思维怪圈是很难跳出的,所以在活动设计时要经常和大家交流,站在一个小白用户角度考虑问题。

    2.有创意能够抓住用户心理,活动本身有趣给予用户参与的一个很好的理由,是刺激用户参与并分享有利因素。抓住用户的兴趣点,满足不同用户个性化需求,满足用户虚荣心。很多时候运营人员要设计一个全新的活动是比较困难的,所以大部分活动策划都是站在成功活动基础上去微创新。微创新指借鉴以往成功活动模式,并寻求部分变化,这里变化可以是主题,可以是参与规则,也可以是参与平台等等,但活动主体模式基本一致。

    下面补充3个比较受3用户欢迎的活动类型:

    1.互动型活动

    互动型活动特征在于该活动形式大众,潜在参与对象多数有关相关经历,而且需要和活动发起方进行相关的沟通交流,比如微博段子手经常发起的话题“你吃过最难吃的食物是什么“、“你请假用过的奇葩理由”等。

    2.猎奇型活动

    猎奇型活动的特征在于独特、新奇,甚至怪诞。比如看到这样的新闻大家一般都会感兴趣的点击进去,“高三学生一年交往335个女友,食堂大妈都是他对象”、“武汉大学惊现女学霸,连续通宵自习3晚”。

    3.隐私型活动

    隐私型活动是目前被诟病比较多的一种活动形式,当然也是传播效果比较明显的一类活动,因为他们往往和性、不好意思公开的话题甚至内心的阴暗面相关。比如“在公告场所放屁是一种什么样的体验”、“早上下楼取快递你有穿内衣吗”、“第一次XXOO是什么时候”、“接吻大赛”、“BOSS吐槽大赛”等。

    第四步,做好活动执行时方案优化

    在活动执行上线时,这时监控效果就变得尤为重要,看活动是否在预期轨道上。如果在可调整的范围内,就尽快行动。这时你需要监控的就是数据和突发状况:

    数据,分为按实时的和单位时间的(一般按天)两种情况,要对数据波动情况有心理预期,认为上下多少算是正常的。如果超出波动范围,就被认为是异常情况,需要追查一下具体原因。可能性等同于上文的「风险点」。紧密关注会出现用户反馈的所有平台,比如用户群、贴吧、微博、朋友圈等。

    针对紧急事件和特殊事件,必须要有方案。特别是碰到大型活动的时候,根本不会让你有大量时候去思考补救措施。比如,服务器档机、系统异常等等。这些特殊情况出现时,我们活动应该继续,还是暂定。这些都是我们需要考虑到的。

    第五步,活动复盘对运营的价值尤为重要

    复盘,就是对过去做的事情重新演绎一次,从而获取对这件事更深的理解。没有复盘性的活动总结,活动只会越做越差。只有对活动整个过程进行细致的梳理、分析、总结才会凝聚成你的经验,而不仅仅是经历。

    活动复盘主要是可以分四步走:

    1、收集数据

    关于本次活动的所有数据都需要做收集、整理和分析。首先拿出当初做活动时定下的运营目标,计划新增多少用户,次日留存率是多少,有多少新增付费用户,Arup值是多少。客观地把当初的活动目标再拿出来看一遍,这时候也可,包也可以试着让团队成员来回顾,看是否每个人都会活动目标都足够清晰。

    2、同比和环比

    通过活动数据进行往期的同比和环比,评估这次活动的效果。对获取的数据结果进行一个简单处理,比如说获取到用户增长为5000人,那么用户增长的时间段分布式怎样的,增长最多的那个时间点有那些事件发生;反过来,也可以把宣传资源投放的时刻对应的增长变化提前呈现出来,看是否有哪部分是没有执行到位的。

    3、原因和现状分析

    分析这次活动带来的收益和不足,分析原因,以及下一阶段可以采取的措施。团队讨论深入地分析产生结果的原因,根据现有目标和结果的差异,提出部分假设,比如:是否高估了某个渠道的转化?或者是投放的时间点没有选择到最佳?还是宣传文案出了问题,没能打动用户?是不是Landing Page的某些功能不够顺畅?

    4、自我反思和总结

    完成这次活动之后,活动运营需要进行自我总结,分析活动成功与不足之处,便于下次做好活动。当你开始复盘之后,就会逐步体会到活动复盘,对于提升活动运营效果的巨大好处的。

    第三层,高级运营,运用丰富的资源把事情做得更好

    资源对于产品运营来说,那可谓是至关重要,不论你是做活动运营还是做BD或者做其他,拥有相对丰富的资源,将对你的项目整体进度起着很大的重要。

    如果说中级运营做活动运营可以打75分,那么高级运营就是那25分的补充者。我们都知道,做活动策划是很耗人力物力财力的,资金预算也是做活动前要考虑的头等大事,预算的多少将直接这场活动的效果。

    而如果拥有相对丰富的资源以及将它整合起来,不但省时省力还省钱。在我之前效力过的一家活动策划公司,当时帮某汽车品牌做一个圣诞节营销事件。我们当时遇到的最大的问题就是遇资金不够(其实就是甲方给的钱不够)不能专门定制一个线下活动,但是我们又不能放弃这么好的机会,帮一个世界500强做一个营销事件,如果做成功这对公司的整体实力以及对外的谈资都有会很大的提升。

    思前想后,刚好跟我们合作的一个俱乐部主办方在圣诞节将会有一个比较大型的活动要举办,这个主办方刚好跟我们的VP兼运营总监,也是我们的运营总监是合作伙伴。这时该发挥我们总监的作用了。我们的vp跟主办方接洽后,将通过整合,将这个活动包装成这个汽车品牌的送福利专场,就是我们提前准备的方案中提到,先在线上搞个类似粉丝抽奖活动,礼品就是这场高档次的活动入门券,然后通过这部汽车(仪式感:装扮成圣诞送福利专车)将这些中奖用户送到现场。

    这次线上线下的结合,很好地将活动的亮点凸现出来,品牌主满意,用户的体验也很好。最重要的是本身需要30万才能完成的活动,结果我们就以三分一的费用就办的漂漂亮亮。

    在这场成功的线上线下活动中,我们的vp扮演着重要的角色,将两个互不相干的两发拉拢在一起,策划了一场漂亮的活动,这就是资源整合的作用,也是我们所说的资源跨界。

    当去到高级运营的级别时,在很多人看来是个大事情,但是在他们的眼里将变成小事一桩,小事情就根本不要烦他。如果你有细心留意,你会发现现在很多企业的高级运营,他们很多时候都是充当着一个商务的角色,落实到执行上的 事情不会涉及过多,更多的是指个大方向,或者将精力聚焦在更重要的事,那就是资源的整合以及谈判。

    第四层,顶级运营,运筹帷幄之中 决胜千里之外

    如果说上面的人都在执行或者半执行布置下去的战术,那么后面就一定得有战略的部署者,就好似诸葛亮。而这诸葛亮者往往都是运筹帷幄之中,这个就是顶级运营(顶级运营一般是公司的COO或者VP)

    这个顶级运营已经不是狭义的运营,而是广义上的运营,就是上升到公司宏观的管理层面,包括技术、市场、产品上的战略性思维。

    什么是战略性思维?我觉得这种战略性思维主要可以表现为:大局观、细算力。大局观指的是长远的计划,细算力就是日常具体工作的力度。

    当年在第二次大战期间,丘吉尔以花甲高龄临危受命,力挽狂澜,处境险恶,压力巨大。然而,丘吉尔的思考模式取向仍然是离不开“大局观”及“细算力”的。

    坐上这个位置的人,是具有大局观和细算力的人。他们对企业的绩效直接负责,以企业竞争为导向,制定公司正常运作的战略保证公司的正常运转。他们在制定运营竞争策略时,我觉得他们往往都会遵循竞争战略之父迈克尔·波特的竞争战略理论观点:

    1.总成本领先战略。这是在某一产业领域内使成本低于竞争对手而取得领先地位的战略,其着眼点是取得价格竞争优势。在这种战略下,一般是运营系统具有一定的规模优势和技术高、产量大等优势。成本领先战略要求企业加强对费用的控制,以及最大限度地减小研究开发、服务、推销、广告等方面的成本。为了达到这些目标,有必要在管理方面对成本控制给予高度重视。尽管质量、服务以及其它方面也不容忽视,但贯穿于整个战略中的主题是使成本低于竞争对手。显然,处于低成本地位的企业可以获得高于行业平均水平的收益。因为它的低成本意味着当别的企业在竞争过程中已失去利润时,这个公司仍然可以获取利润。

    2.差异化战略。这种战略要求运营系统与其竞争特色的优势相适应,但也要注意成本因素。这种战略是通过公司所有部门的努力,对公司产品在一个或几个方面与竞争对手的产品有所不同。如产品特殊的功能、高超的质量、优质的服务、独特的品牌等等。这种战略将增加公司在产品设计、研发等方面的投入,使产品的成本上升。但是,顾客对产品的偏爱而愿意接受较高的价格,这将弥补公司采用差别化战略而带来的成本上升。但在很多公司里,管理者能够把成本控制在比竞争对手低的同时,将其产品进行差别化。

    3.目标集聚战略。实际上是一种市场细分市场战略,这种战略的前提是企业能够以更高的效率、更好的效果为某一细分市场中的特殊顾客群服务,采用目标集聚战略的企业也具有赢得超过行业平均收益水平的潜力。采用目标集聚战略的公司通常将全力集中在某一特定区域的市场或顾客群。这类公司要么采用低成本战略,要么采用差别化战略,但仅关注于特定的目标市场。采用低成本战略的公司,将资源集中在整个市场的一个或几个细分市场,旨在成为服务于该细分市场的最低成本的公司。

    其实我们在一些基本的运营推广工作的时候,往往也会涉及到一个人是否有大局观的表现。比如我们在做推广及线下的策划上,有经验的推广人员知道很多外链的方式,但是该在哪里增加,增加多少,增加后要达到什么效果都需要网站运营人员进行规划。不能为了留外链而不加限制地发布外链,需要从网站权重、流量、相关性、品牌效应、转化率等方面进行思考。优秀的网络推广,不仅是外链,更重要的是品牌效应,品牌能够遍布在网络各个角落,并且曝光率高,建立网站品牌是网络推广的最终目的。有品牌,有信任,有流量,也就有转化率。所以在我们的微观工作中也时时体现着全局观。

    因此我们又会说,其实初级运营和高级运营没有严格的分水岭,它就体现在我们工作、生活中、只不过其所表现的工作阅历、环境、位置、情况、和职责大小程度不尽相同而已。

    展开全文
  • 近年来,关于大数据讨论已然是热火朝天,虽不说是家喻户晓,那至少对于...那么在这里必要八卦一下Spark了。 Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台。它立足于内存计算,从多迭代批量处理出发,兼
  • 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
  • XML是什么,什么作用

    千次阅读 2017-03-08 01:28:14
    最典型的就是WEB SERVICE,将数据包装成XML来传递,但是这里的XML已经了特定的规格,即SOAP。不过这里还不得不说AJAX,AJAX的应用中,相信也一部分的应用是以自定义XML为数据,不过没有成为工业标准,这里不做...
  • Java013怎样以及因配置Java环境变量 How?怎样设置Java环境变量? Why?为何要设置Java环境变量? JAVA_HOME环境变量作用 PATH环境变量作用 CLASSPATH环境变量作用 Other tools.jar作用 dt.jar作用 基础类...
  • 流(stream):一组顺序的,起点和终点的字节集合,是对数据传输的总称或抽象,对文件中的内容读和写的操作。 及时关闭不使用的流,避免造成资源流失,可能会导致内存溢出 数据流向 输入流: 负责数据的读取 ...
  • 药品的泡罩包装技术介绍

    千次阅读 2008-08-02 16:50:00
    药品的泡罩包装又称为水泡眼包装,简称为PTP(Press through Packaging),是药品包装的主要形式之一,适用于片剂、胶囊、栓剂、丸剂等固体制剂药品的机械化包装。 泡罩包装在我国的兴起 早在二十世纪三十年代
  • XML语言和作用

    2018-11-13 18:03:20
    xml 可扩展标记语言 简介 XML(Extensible Markup Language)由w3c...1:无行为:xml只负责包装数据,没有编程语言的逻辑和行为能力,传送、接收、解析都由应用程序完成。 2:纯文本:只有文本,没有颜色加粗等文本...
  • 产品的消费者不仅应该关注产品的包装,设计及其型号,而且最重要的是应该关注制造这些产品时所起作用的成分。 进行这项研究是为了研究消费者在消费之前,之中和之后对产品标签上的产品内容的意识。 这项研究的目的是...
  • JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据类型也是可以引用的 一.基本数据类型的对象...
  • JAVA基本数据类型及其对应的包装

    万次阅读 2018-09-10 17:18:13
    一、JAVA中的八种基本类型 1、数字类型(6种)  ①byte: ... 作用:byte数据类型主要用于在大型数组中节约空间,用来代替整型,因为byte类型只占八位,占用的空间只有int型的1/4; ②short:  占...
  • 前面说Bean是Spring中关键因素,那Context和Core又有何作用呢?前面吧Bean比作一场演出中的演员的话,那Context就是这场演出的舞台背景,而Core应该就是演出的道具了。只有他们在一起才能 具备能演出一场好戏的最...
  • 我们该跑赢余额宝?

    千次阅读 2014-02-11 13:28:08
    阿里在这过程中,起到的只是投资者、基金公司的中介作用。这一点,与基金销售的其他渠道无异。 支付宝官方网站显示,余额宝是支付宝为个人用户推出的一项余额增值服务。用户把资金转入余额宝即为向基金公司等机构...
  • 企业品牌营销从做起

    千次阅读 2012-09-19 09:24:20
    企业品牌营销从做起,首先要了解什么是品牌营销,拿百科的几句话跟大家来介绍一下品牌营销的简单的概念:所谓的品牌营销就是通过一些渠道让客户对企业品牌或产品的认知的全部过程,但是整体的并不是这样的简单,...
  • 经微软认证的软件公司,可以将.NET Connected 标志图案置于其被认证软件产品的包装,文档,宣传材料和广告中。 .NET Connected标识,标志着您的应用软件基于.NET Framework开发,能够基于XML Web services标准和...
  • 绍华Linux操作系统第3版章节课后答案习题

    千次阅读 多人点赞 2020-10-20 12:37:31
    3.Linux下挂载分区和windows有何不同? 4.下面能查看磁盘空间使用率的____ 5.可以将分区格式化为vfat的命令____ 6.简述对磁盘进行配额管理的意义方法 第八章:Linux编程 1.vi3种基本工作模式:____、____和...
  • @transient 注解 和 transient变量的作用

    千次阅读 2018-04-25 09:57:09
    @transient 和 transient是两码事1.@transient的作用@transient是hibernate和Morphia中的注解,hibernate都熟悉,Morphia是通过同提供一系列围绕mongo java驱动程序的注释和包装程序。hibernate: 实体类中使用了@...
  • 莆田系“游医”以遍布中国

    千次阅读 2014-06-04 13:54:04
     正是基于对于赤脚医生作用的错误认知,部分人在之后对医生的专业化也不合理的看法,而这些愚昧的看法也催生这些游医、老军医的盛行,给了“莆田系”发掘第一桶金的机会。  2、又因国内对执业医生行医长久的...
  • (渲染过程) 谈谈你对重绘和回流的理解 关于Vue 组件中写 name 选项什么作用? Vue 组件间通信哪些方式? Vue 中 key 值的作用? 虚拟 DOM 实现原理 你是如何理解 Vue 的响应式系统的? vue-router 哪些钩子...
  • 他整天想着要是一天能自己的房子住,那该多好呀!如果能住进大别墅,那真的像做梦呀!但是靠汤姆大叔微薄的收入是买不起房子的,于是他想贷款买房,但是因为信用等级达不到标准,即传说中的次级贷款者,所以...
  • 条形码技术在供应链管理中的作用

    千次阅读 2005-02-17 09:41:00
    其中分为以下几个方面:生产厂家将生产 的单个产品进行包装,并将多个产品集中在大的包装箱内;然后,经过运输、批发等环节,在这一环节中通常需要更大的包装;最后,产品通过零售环节流通到消费者手中,产品通常在这一环节...
  • MES & POP 从而来? MES(Manufacturing Execution System)直译成制造运行系统,俗称生产管理系统。直到1990年,才由AMR组织 (美国的咨询调查公司Advanced Manufacturing Research-AMR)提出并开始采用。位于美国的...
  • 把一个XSD文件 添加到该文件夹中时,编译器将把它解析成一个类型的DataSet类,并将它添加到应用程序作用域中。在ASP.NET 1.x中,这一工作由Visual Studio .NET向导,使用一个命令行实用程序(xsd.exe)完成的。 ...
  • 深入浅出Python——Python基础语法全解

    万次阅读 多人点赞 2020-07-24 20:31:37
    解释器的作用2. 解释器的安装三、PyCharm安装与使用1. PyCharm的作用2. PyCharm安装与使用四、注释1. 注释的作用2. 注释的分类及语法五、变量1. 变量的作用2. 定义变量2.1 标识符2.2 命名习惯2.3 使用变量2.4 认识
  • Java 面试题

    万次阅读 多人点赞 2019-06-19 14:35:46
    基本类型和包装类对象使用 == 和 equals进行比较的结果? 什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题? hashCode()相同,equals() 也一定为 true吗? final 在 java 中的作用 final finally ...
  • 设计模式02——Adapter模式

    千次阅读 2018-09-10 21:31:19
    适配器设计模式,顾名思义就是将适配器的作用总结抽象成为一种代码的组织方式,将现有的代码通过适配器进行适配,以满足项目对另外一个类或者接口的要求。换句话说就是将一个类的接口适配(包装/转换)成客户(调用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,952
精华内容 9,180
关键字:

包装有何作用