精华内容
参与话题
问答
  • Message详解

    2018-10-27 21:53:01
    Message详解   每个部分都有可以表现为字节序列的内容。例如,在简单电子邮件消息的部分中,内容是消息的主体。但是在多部分消息中,内容本身可以包含其他部分。 读取部分内容 Part接口声明了两个可以确定部分...

                                                           Message详解


     

    每个部分都有可以表现为字节序列的内容。例如,在简单电子邮件消息的部分中,内容是消息的主体。但是在多部分消息中,内容本身可以包含其他部分。

    读取部分内容

    Part接口声明了两个可以确定部分的MIME内容类型的方法。

    getContentType()

    isMimeType(String mimeType)

    1.当得到一个Message对象时,调用它的getSubject(),getFrom()等等方法,可以得到邮件的基本信息。

    2.调用Message.getContentType()方法来判断邮件的类型

    (1)如果邮件类型是“text/plain”或者“text/html”,说明邮件

    是纯文本,可以调用getContent()来获取邮件内容并加以显示。


     

    (2)如果邮件类型是“multipart/*”,表示邮件类型是复合类型,此时需将邮件的getContent()方法返回的对象

    转换成Multipart。

    3.调用Multipart的getCount()方法来检测Multipart中包含多少BodyPart对象,通过循环取出每个BodyPart对象

    在处理每个BodyPart对象时,调用它的getContent()方法确定它的类型,有三种情况:

    (1)当其类型是”text/*“表示是纯文本

    (2)当其类型是”multipart/*“需要重复2.(2)->3步骤

    (3)当其表示图片,音频等二进制内容时,可以调用getInputStream()获取原始的二进制内容。

    写入部分内容

    setText(String text)

    setContent(Object o,String type)

    writeTo(OutputStream out)

    之前的文章发送电子邮件,只是发送的简单文本而已,这对于现在的电子邮件客户端而言,是非常简单的;在创建复杂邮件之前,先要弄明白一些概念:

    1.MimeMessage :继承Message,表示整封邮件

    2.MimeBodyPart:表示邮件的一个MIME消息

    3.MimeMultipart:表示一个由多个MIME消息组合成的组合MIME消息。

    故:

    1.复杂邮件和简单文本邮件一样,都是有MimeMesage表示的

    2.对于复杂邮件,不能简单的用MimeMessage.setText 方法生成,而是要将MimeMultipart对象设置到MimeMessage对象中

    3.MimeMultipart 用来组合一个或者多个MimeBodyPart对象,其中每个MimeBodyPart对象使用MimeMultipart.addBodyPart(BodyPart part)方法

    将一个MIME消息添加到MimeMultipart对象中

    4.MimeBodyPart 对象表示的MIME消息,可能还是一个MIME组合消息,那么它的内容就需要使用一个MimeMultipart表示,这一步只是重复上述步骤而已。

    可见,不管邮件体重的数据层次关系多么复杂,我们都可以用MimeBodyPart和MimeMultipart对象的这种相互嵌套关系,来组织并封装复杂邮件。

    展开全文
  • 获取Message实例的方法: 这种方法很常见,就是常见的创建对象的方式。每次需要Message对象的时候都创建一个新的对象,每次都要去堆内存开辟对象存储空间,对象使用完后,jvm又要去对这个废弃的对象进行垃圾回收。 ...

    获取Message实例的方法:

     这种方法很常见,就是常见的创建对象的方式。每次需要Message对象的时候都创建一个新的对象,每次都要去堆内存开辟对象存储空间,对象使用完后,jvm又要去对这个废弃的对象进行垃圾回收。

    • new Message() 

     

    • handler.obtainMessage() 
    • Message.obtain()  

    通过obtain方法获取Message对象的详情。通过obtain方法获取Message对象使得Message到了重复的利用,减少了每次获取Message时去申请空间的时间。同时,这样也不会永无止境的去创建新对象,减小了Jvm垃圾回收的压力,提高了效率。

    具体需要从源码中查看。

    展开全文
  • Message对象

    2018-01-27 23:01:29
    1: 每一个Message对象都包含两个对象:  (1)google::protobuf::Descriptor 描述对象,是Message所有Filed的一个集合,它又包含了FieldDescriptor 对象; 每个filed都对应一个FieldDescriptor;  (2)google::...

    一)描述

    1: 每一个Message对象都包含两个对象:

          (1)google::protobuf::Descriptor 描述对象,是Message所有Filed的一个集合,它又包含了FieldDescriptor 对象; 每个filed都对应一个FieldDescriptor;

          (2)google::protobuf::Reflection 反射对象, 通过它 + FieldDescriptor,set/get filed对象的值;

    2: 每一个Message对象,可以通过统一的对象工厂来构建, 根据协议生成了代码后,只要传入Message的名字,就能构建出对应的Message的类的实例;

    二)构建message

    1:  根据消息的名字来构建对应的Message类型的C++实例

    google::protobuf::Message* create_message(const char* typeName) 
    {  
    	google::protobuf::Message* message = NULL;  
    
    	//根据名字找到message的描述对象
    	const google::protobuf::Descriptor* descriptor =  
    		google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(typeName);  
    	if (descriptor) 
    	{  
    		//根据描述对象到对象工厂里,生成对应的模板对象
    		const google::protobuf::Message* prototype =  
    			google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);  
    		if (prototype) 
    		{  
    			//根据模板生成出来一个
    			message = prototype->New();  
    		}  
    	}  
    	return message;  
    } 

    2: 删除Message:  delete操作

    3: 返回一个基类的指针,指向一个子类的实例;

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    using namespace std;
    
    #include "../proto/person.pb.h"
    
    //根据字符串类名创建实例
    google::protobuf::Message* create_message(const char* typeName) 
    {  
    	google::protobuf::Message* message = NULL;  
    
    	//根据名字找到message的描述对象
    	const google::protobuf::Descriptor* descriptor =  
    		google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(typeName);  
    	if (descriptor) 
    	{  
    		//根据描述对象到对象工厂里,生成对应的模板对象
    		const google::protobuf::Message* prototype =  
    			google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);  
    		if (prototype) 
    		{  
    			//根据模板生成出来一个
    			message = prototype->New();  
    		}  
    	}  
    	return message;  
    } 
    
    int main(int argc,char* agrv[])
    {
    	//====================================普通创建对象=================================
    #pragma region customNew
    	Person p;
    	p.set_name("jadeshu");
    	p.set_age(24);
    	p.set_email("jadeshu@qq.com");
    
    	printf("%s %s %d\n",p.name().c_str(),p.email().c_str(),p.age());
    
    	//反序列化
    	string strout("");
    	p.SerializeToString(&strout);
    
    	Person jadeshu;
    	jadeshu.ParseFromString(strout);
    	//printf("%s %s %d\n",jadeshu.name().c_str(),jadeshu.email().c_str(),jadeshu.age());
    	cout << jadeshu.name() <<" " << jadeshu.email()<<" "   << jadeshu.age() << endl;
    	//==================================================================================
    	printf("===============================================\n");
    #pragma endregion customNew
    
    #pragma region MessageNew
    	//创建实例
    	//基类的message---->Person的实例
    	google::protobuf::Message* pMsgObj = create_message("Person");
    
    	Person*  perCur = (Person*)pMsgObj;
    	perCur->set_name("wudi");
    	perCur->set_age(50);
    	perCur->set_email("xxxx@qq.com");
    	cout << perCur->name() <<" " << perCur->email()<<" "   << perCur->age() << endl;
    	//删除pMsgObj
    	delete pMsgObj;
    
    #pragma endregion
    	system("pause");
    	return 0;
    }

    三)Message获取filed描述

    1: 遍历每个filed;

    const Descriptor* descriptor = message->GetDescriptor();
     for (int32_t index = 0; index < descriptor->field_count(); ++index) {
    	const FieldDescriptor* fd = descriptor->field(index);
    	const string& name = fd->name(); 
    }
    

    2: filed:

        name: filed的文本名字;

        is_required:是否为required 选项;

        is_repeated:是否为数组;

        cpp_type:返回类型;

    四)Message设置filed

    1: 获取Reflection

    2: 根据对应的每个字段描述的类型,来设置字段;

       根据字段的类型fd->ccp_type(),使用Reflection对象来设置Messsage的每一个filed;

    FieldDescriptor::CPPTYPE_ENUM FieldDescriptor::CPPTYPE_UINT64          FieldDescriptor::CPPTYPE_MESSAGE
           
         成员:
     	reflection->SetDouble(message, fd, value);
    	.....
         数组: 
    	reflection->AddDouble(message, fd, value);
    	.....
    




    展开全文
  • Message的参数和方法

    千次阅读 2016-01-26 09:31:22
    public int arg1 如果只需要存储几个整型数据,arg1 和 arg2是setData()的低成本替代品。   public int arg2 如果只需要存储几个整型数据,arg1 和 arg2是...当使用Message对象在线程间传递消息时,如果它

    public int arg1

    如果只需要存储几个整型数据,arg1  arg2setData()的低成本替代品。

     

    public int arg2

    如果只需要存储几个整型数据,arg1  arg2setData()的低成本替代品。

     

    public Object obj

    发送给接收器的任意对象。当使用Message对象在线程间传递消息时,如果它包含一个Parcelable的结构类(不是由应用程序实现的类),此字段必须为非空(non-null)。其他的数据传输则使用setData(Bundle)方法。

    注意Parcelable对象是从FROYO版本以后才开始支持的。

     

    public Messenger replyTo

    指明此message发送到何处的可选Messenger对象。具体的使用方法由发送者和接受者决定。

     

    public int what

    用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。

     

    公共构造器

      public      Message()       

      构造器(但是获取Message对象的最好方法是调用Message.obtain())。

     

    公共方法

    public void copyFrom (Message o)

    使此message跟参数o相似。浅拷贝数据域。不拷贝源message的链表字段,时间戳和目标/回调。

     

    public int describeContents ()

    描述了包含在Parcelable对象排列信息中的特殊对象的类型。

    返回值

             一个标志位,表明Parcelable对象特殊对象类型集合的排列。

     

    public Runnable getCallback ()

    获取回调对象,此对象会在message处理时执行。此对象必须实现Runnable接口。回调由接收此消息并分发的目标handler调用。如果没有设置回调,此消息会分发到接收handlerhandleMessage(Message)

     

    public Bundle getData ()

    获取附加在此事件上的任意数据的Bundle对象,需要时延迟创建。通过调用setData(Bundle)来设置Bundle的值。需要注意的是,如果通过Messenger对象在进程间传递数据时,需要调用Bundle类的Bundle.setClassLoader()方法来设置ClassLoader,这样当接收到消息时可以实例化Bundle里的对象。

             参考

                      peekData()

                      setData(Bundle)

     

    public Handler getTarget ()

    获取将接收此消息的Handler对象。此对象必须要实现Handler.handleMessage()方法。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。

     

    public long getWhen ()

    返回此消息的传输时间,以毫秒为单位。

     

    public static Message obtain (Handler h, int what, int arg1, int arg2, Object obj)

    obtain()一样,但是设置了target, what, arg1, arg2obj的值。

             参数

                       h                设置的target

                       what         设置的what

                       arg1          设置的arg1

                       arg2          设置的arg2

                       obj             设置的obj

             返回值

                       从全局池中分配的一个Message对象。

     

     

    public static Message obtain (Handler h)

    obtain()一样,但是设置了target的值

             参数

                       h                消息对象的target成员的值

             返回值

                       从全局池中分配的一个Message对象。

     

    public static Message obtain (Handler h, Runnable callback)

    obtain(Handler)一样,但是设置回调函数,在Message返回时调用。

             参数

                       h                消息对象的target成员的值

                       callback    当消息处理时会调用的回调函数

             返回值

                       从全局池中分配的一个Message对象。

     

    public static Message obtain ()

    从全局池中返回一个新的Message实例。在大多数情况下这样可以避免分配新的对象。

     

    public static Message obtain (Handler h, int what, int arg1, int arg2)

    obtain()一样,但是设置了target, what, arg1arg2的值

             参数

                       h                设置的targe

                       what         设置的what

                       arg1          设置的arg1

                       arg2          设置的arg2

             返回值

                       从全局池中分配的一个Message对象。

     

    public static Message obtain (Message obj)

    obtain(),但是从一个已存在的消息中拷贝值(包括它的目标)。

             参数

                       orig           要拷贝的源消息

             返回值

                       从全局池中分配的一个Message对象。

     

    public Bundle peekData ()

    getData()相似,但是并不延迟创建Bundle。如果Bundle对象不存在返回null。更多信息见getData()

             参考

                       getData()

                       setData(Bundle)

     

    public void recyle ()

    向全局池中返回一个Message实例。一定不能在调用此函数后再使用Message——它会立即被释放。

     

    public void sendToTarget ()

    Handler发送此消息,getTarget()方法可以获取此Handler。如果这个字段没有设置会抛出个空指针异常。

     

    public void setData (Bundle data)

    设置一个任意数据值的Bundle对象。如果可以,使用arg1arg2域发送一些整型值以减少消耗。

    参考

             getData()

             peekData()

     

    public void setTarget (Handler target)

    设置将接收此消息的Handler对象。

     

    public String toString ()

    返回一个Message对象简单的,可读懂的描述信息。鼓励子类重写此方法,实现时最好把对象的类型的数据考虑进去。默认的实现等同与以下表达式:

          

    如果需要实现toString方法,参考Writing a useful toString method

                       返回值

                                一个代表此对象的可打印字符串

     

    public void writeToParcel (Parcel dest, int flags)

    将类的数据写入外部提供的Parcel

    参数

                                dest   对象被写入的Parcel

                                flags 对象如何被写入的附加标志,可能是0PARCELABLE_WRITE_RETURN_VALUE

                      



    Message.obtain函数:有多个obtain函数,主要功能一样,只是参数不一样。作用是从Message Pool中取出一个Message,如果Message Pool中已经没有Message可取则新建一个Message返回,同时用对应的参数给得到的Message对象赋值。 

    Message Pool:大小为10个;通过Message.mPool->(Message并且Message.next)-> (Message并且Message.next)-> (Message并且Message.next)...构造一个Message Pool。Message Pool的第一个元素直接new出来,然后把Message.mPool(static类的static变量)指向它。其他的元素都是使用完的 Message通过Message的recycle函数清理后放到Message Pool(通过Message Pool最后一个Message的next指向需要回收的Message的方式实现)。下图为Message Pool的结构: 
     

    展开全文
  • vue消息提示this.$message方法

    万次阅读 2019-03-24 22:30:25
    //弹出信息 alertMessage(action,a){ var msg,type; switch(a){ case '1': type='success'; msg = ...
  • 1. 前言创建Message对象的时候,有三种方式,分别为: 1.Message msg = new Message(); 2.Message msg2 = Message.obtain(); 3.Message msg1 = handler1.obtainMessage(); 这三种方式有什么区别呢?2.使用...
  • Message的用法

    千次阅读 2015-02-10 14:08:38
    1. MessageActivity代码: import android.app.Activity; import android.os.Bundle; import android.os....import android.os.Message; import android.view.Menu; import android.view.View; import android.w
  • $.message的各种用法

    千次阅读 2014-07-30 15:41:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • Message 消息提示

    2019-06-01 10:15:59
    Message 消息提示 常用于主动操作后的反馈提示。与 Notification 的区别是后者更多用于系统级通知的被动提醒。 从顶部出现,3 秒后自动消失。 1、不同状态 用来显示「成功、警告、消息、错误」类的操作反馈。 <...
  • 如何使用$.message

    万次阅读 2018-06-20 09:31:00
    jQueryEasyUI Messager基本使用一、jQueryEasyUI下载地址http://www.jeasyui.com/二、jQueryEasyUI Messager基本使用1、$.messager.alert(title, msg, icon, fn)1&gt;、基本用法代码:1234567891011121314151617...
  • Message的几种简单用法

    万次阅读 2017-03-18 09:50:34
    arg1和arg2是成本较低的替代品使用 setData(),如果你只需要存储一些整数值。 obj是任意对象发送给收件人。 what是用户定义的消息代码,以便收...Message msg = new Message(); msg.arg1 = 1; msg.arg2 = 2;
  • Android的Message机制(简单小结)

    万次阅读 多人点赞 2012-06-15 21:45:53
    网上以文档形式流传,不知道原文在哪,感谢原作者了!...对于Android的Message机制主要涉及到三个主要的类,分别是Handler、Message、Looper;首先对每个类做一个简单介绍;然后再介绍所谓的Android的Messa
  • 文章目录MessageMessage 的基本概念Messagebox Message Message 的基本概念 Messagebox
  • 1. Message 语法: Message(父对象, options, …) Message( )方法的第一个参数是父对象,表示这个标签将建立在哪一个父对象内。下列是Message( )方法内其他常用的options参数。 (1)anchor:如果空间大于所需时,...
  • tkinter教程9:控件Message,弹出框Toplevel和Messagebox 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: python版本:3.5 开发环境:pyCharm 源码: MessageMessage类似Entry...
  • package com.example.util.msg; import lombok.Data; @Data public class Message { /** * 状态码 1:成功, 0:失败 */ public static final int STATUS_OK = 1; public static final int STATUS_F...
  • 纯js中使用MessageMessageBox的方法

    千次阅读 2018-12-07 10:45:00
    常规是在全局引入message,但是如果我想在二次封装的纯.js文件里面使用: import { Message } from 'element-ui' function(){ Message({ showClose: true, message: ‘消息提示’, type: 'error', ....
  • 今天在全局使用Message组件的时候(单独使用import Message from ‘element-ui’),发现第一次打开Message后再打开的Message无法关闭了,无论是使用showClose手动关闭还是通过duration来自动关闭,在第二次打开对应的...
  • 在vue项目中的main.js中直接使用element-ui中的Message 消息提示、MessageBox 弹框、Notification 通知 需求来源:向后台请求数据时后台挂掉了,后台响应就出现错误,不做处理界面就卡住了,这时...
  • MessageBox 弹框

    2018-03-14 07:09:00
    从场景上说,MessageBox 的作用是美化系统自带的alert、confirm和prompt,因此适合展示较为简单的内容。如果需要弹出较为复杂的内容,请使用 Dialog。 消息提示 当用户进行操作时会被触发,该对话框中断用户...

空空如也

1 2 3 4 5 ... 20
收藏数 1,924,783
精华内容 769,913
关键字:

message