根据 XMPP 的 XEP 标准协议规范,实现 avatar 头像传输与存储的功能主要有三种实现方式,分别对应于协议规范:

    + 【XEP-0153】vCard-BasedAvatars     http://xmpp.org/extensions/xep-0153.html

    + 【XEP-0084】UserAvatar             http://xmpp.org/extensions/xep-0084.html
   + 【XEP-0008】IQ-BasedAvatars        
http://xmpp.org/extensions/xep-0008.html

其中

    + XEP-0153是通过将 avatar 头像存储在 vcard 的 XML 报文中实现的,这个也是 openfire 和 spark 中支持的方式;

在 openfire 中的 vcard 的实现都在 org.jivesoftware.openfire.vcard 包中,其中:


       -
用户的 vcard 的存储实现在类 DefaultVCardProvider 中处理了 vcard 的查询,删除,更新,新增等 DB 操作;
       - 在VCardManager 中实现对 vcard 的缓存与管理(包括新增,删除,更新,以及查询);

这种实现方式比较直接,在服务端就是将用户的 vcard(XML格式)信息一起存储在表(ofVcard)中,示例:


 
     
     
     
 

 
     
     
 

 
 
 <br>  <NICKNAME/><br><br><span style="color:#2d4fc9;"><PHOTO><TYPE>p_w_picpath/jpeg</TYPE><BINVAL>/9j/4AAQSkZJRgABAQEAYABgAAD......YlFFFM4T//2Q==</BINVAL></PHOTO></span><br><br>  <EMAIL><br>      <HOME/><br>      <INTERNET/><br>      <PREF/><br>      <USERID/><br>  </EMAIL><br>  <TEL><PAGER/><WORK/><NUMBER/><br>  </TEL><br>  <TEL><CELL/><WORK/><NUMBER/><br>  </TEL><br>  <TEL><VOICE/><WORK/><NUMBER/><br>  </TEL><br>  <TEL><FAX/><WORK/><NUMBER/><br>  </TEL><br>  <TEL><PAGER/><HOME/><NUMBER/><br>  </TEL><br>  <TEL><CELL/><HOME/><NUMBER/><br>  </TEL><br>  <TEL><VOICE/><HOME/><NUMBER/><br>  </TEL><br>  <TEL><FAX/><HOME/><NUMBER/><br>  </TEL><br>  <ADR><WORK/><PCODE/><br>  <REGION/><br>  <STREET/><br>  <CTRY/><br>  <LOCALITY/><br>  </ADR><br>  <ADR><HOME/><PCODE/><br>  <REGION/><br>  <STREET/><br>  <CTRY/><br>  <LOCALITY/><br>  </ADR><br>  </vCard></p></td> </tr> </tbody> </table> <p> </p> <p><span style="font-family:'微软雅黑', sans-serif;">     + </span><strong><span style="font-family:'微软雅黑', sans-serif;color:#9c004c;">XEP-0008</span></strong><span style="font-family:'微软雅黑', sans-serif;">的 IQ-Based Avatars 实现方式现在已不被推荐,用官方协议来说:</span></p> <p> </p> <table width="100" style="width:703px;"> <tbody> <tr> <td valign="top" style="padding:2px 2px 2px 2px;"><p>WARNING: Consideration of this document  has been Deferred by the XMPP Standards Foundation. Implementation of the  protocol described herein is not recommended</p></td> </tr> </tbody> </table> <p> </p> <p><span style="font-family:'微软雅黑', sans-serif;">     + </span><strong><span style="font-family:'微软雅黑', sans-serif;color:#9c004c;">XEP-0084</span></strong><span style="font-family:'微软雅黑', sans-serif;"> User Avatar </span><span style="font-family:'微软雅黑', sans-serif;">是通过基于 pubsub 协议的基础上实现用户 头像 的发布(publish) 与 其他用户的订阅(subscribe);这也是 beem 的实现方式(beem 中也提供了直接通过 url 的方式下载头像);</span></p> <p> </p> <p><span style="font-family:'微软雅黑', sans-serif;">在 User Avatar 的协议中定义了两个 pubsub 节点,分别为:</span></p> <p><span style="font-family:'微软雅黑', sans-serif;"> <br><span>       - metadata </span><span style="font-family:'微软雅黑', sans-serif;">节点:主要包括 avatar 的状态信息;</span><br><span>       - data </span>节点:就是 avatar 的数据;<br><br>该协议也指出可以通过 HTTP 协议方式访问 avatar 的存储;<br><br>按照官方协议说法,该协议的实现方式可能要替代其他两种实现方式:<br><br><span>   It is intended that this specification will supersede both IQ-Based Avatars [6]and vCard-Based Avatars [7] once the PEP subset of XMPP publish-subscribe isimplemented and deployed widely enough.</span><br><br>针对 user avatar 方式的实现,针对 publisher 与 subscriber 至少需要完成如下功能:<br><br><span>       - Publishing avatar data</span><br><span>       - Updating metadata about the current avatar</span><br><span>       - Disabling avatars</span><br><br><span>       - Discovering avatar availability</span><br><span>       - Receiving notification of avatar changes</span><br><span>       - Retrieving avatar data via pubsub</span><br><span>       - Retrieving avatar data via HTTP</span><br></span></p> <span></span> <p><span style="font-family:'宋体';">上面只是对实现avatar相关XEP协议做一个初步的了解,我这里的实例仍然“偷懒”采用了VCard方式实现。</span></p> <p><span style="font-family:'宋体';">协议参考</span>: http://xmpp.org/extensions/xep-0054.html</p> <p>Smack <span style="font-family:'宋体';">中的</span> VCard API <span style="font-family:'宋体';">参考</span>: http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/</p> <p> </p> <p style="margin-top:16px;margin-bottom:16px;margin-left:24px;"><strong>1,<span style="font-family:'宋体';">设置用户</span>blue<span style="font-family:'宋体';">的</span>VCard<span style="font-family:'宋体';">中的头像</span>avatar<span style="font-family:'宋体';">信息:</span></strong></p> <p style="margin-bottom:16px;margin-left:56px;">a)<span style="font-family:'宋体';">首先确认</span>ProviderManager<span style="font-family:'宋体';">已经加入</span>vcard-temp<span style="font-family:'宋体';">,如下代码:</span></p> <table style="width:703px;"> <tbody> <tr> <td width="568" valign="top" style="border-color:#000000;border-width:1px;padding:0px 7px;"><p><br></p><p>ProviderManager pm =  ProviderManager.getInstance();</p><p><br></p><p>         // Private Data Storage</p><p>         pm.addIQProvider("query", "jabber:iq:private", new  PrivateDataManager.PrivateDataIQProvider());</p><p><br></p><p>         // Roster Exchange</p><p>         pm.addExtensionProvider("x", "jabber:x:roster",  new RosterExchangeProvider());</p><p><br></p><p>         // Message Events</p><p>         pm.addExtensionProvider("x", "jabber:x:event", new  MessageEventProvider());</p><p><br></p><p>         // Delayed Delivery</p><p>         pm.addExtensionProvider("x", "jabber:x:delay", new  DelayInformationProvider());</p><p><br></p><p>         // Version</p><p>         try {</p><p>             pm.addIQProvider("query", "jabber:iq:version",</p><p>                     Class.forName("org.jivesoftware.smackx.packet.Version"));</p><p>         } catch (ClassNotFoundException e) {</p><p>            // Not sure what's happening  here.</p><p>         }</p><p><br></p><p><strong><span style="color:#00b050;">//  VCard</span></strong></p><p><strong><span style="color:#c00000;">pm.addIQProvider("vCard",  "vcard-temp", new VCardProvider());</span></strong></p><p><br></p><p>         // Offline Message Requests</p><p>         pm.addIQProvider("offline",  "http://jabber.org/protocol/offline", new  OfflineMessageRequest.Provider());</p></td> </tr> </tbody> </table> <p style="margin-top:16px;margin-bottom:16px;margin-left:56px;">b)<span style="font-family:'宋体';">设置用户选择的头像(其中还附带演示了设置用户</span>blue<span style="font-family:'宋体';">的其他信息,如</span>FirstName<span style="font-family:'宋体';">,</span>LastName<span style="font-family:'宋体';">,以及</span>NickName<span style="font-family:'宋体';">),如下示例代码:</span></p> <table style="width:703px;"> <tbody> <tr> <td width="568" valign="top" style="border-color:#000000;border-width:1px;background-color:#F2F2F2;padding:0px 7px;"><p><br></p><p>     public class SetVCardTask extends AsyncTask<Uri, Integer, Long></p><p>     {</p><p>         @Override</p><p>         protected Long doInBackground(Uri... params)</p><p>         {</p><p>            if (params.length < 1) {</p><p>                return Long.valueOf(-1);</p><p>            }</p><p><br></p><p>            Uri uriFile = params[0]; <strong><span style="color:#00b050;">// </span></strong><strong><span style="font-family:'宋体';color:#00b050;">需要传输的头像文件</span></strong></p><p>            ByteArrayOutputStream baos = new  ByteArrayOutputStream();</p><p>            FileInputStream fis;</p><p>            try</p><p>            {</p><p>                String[] proj = {  MediaStore.Images.Media.DATA };</p><p>                Cursor actualp_w_picpathcursor =  managedQuery(uriFile,proj,null,null,null);</p><p>                int actual_p_w_picpath_column_index</p><p>                        =  actualp_w_picpathcursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);</p><p>                 actualp_w_picpathcursor.moveToFirst();</p><p>                String filePath =  actualp_w_picpathcursor.getString(actual_p_w_picpath_column_index);</p><p>                fis = new FileInputStream(new  File(filePath));</p><p>                byte[] buf = new byte[1024];</p><p>                int n;</p><p>                while (-1 != (n =  fis.read(buf)))</p><p>                {</p><p>                    baos.write(buf, 0, n);</p><p>                }</p><p>            }</p><p>            catch (Exception e)</p><p>            {</p><p>                e.printStackTrace();</p><p>            }</p><p>            byte[] bbytes =  baos.toByteArray();</p><p><br></p><p><strong><span style="color:#00b050;">// </span></strong><strong><span style="font-family:'宋体';color:#00b050;">设置和更新用户信息</span></strong></p><p><strong><span style="color:#c00000;">VCard vCard = new VCard();</span></strong></p><p><strong><span style="color:#c00000;">             vCard.setFirstName("Steven");</span></strong></p><p><strong><span style="color:#c00000;">             vCard.setLastName("Hu");</span></strong></p><p><strong><span style="color:#c00000;">             vCard.setNickName("</span></strong><strong><span style="font-family:'宋体';color:#c00000;">安静的疯子</span><span style="color:#c00000;">");</span></strong></p><p><strong><span style="text-decoration:underline;"><span style="color:#31859c;">vCard.setAvatar(bbytes);</span></span></strong></p><p><strong><span style="color:#c00000;">            try</span></strong></p><p><strong><span style="color:#c00000;">            {</span></strong></p><p><strong><span style="color:#c00000;">                vCard.save(MainHelloIM.getInstance().getConnection());</span></strong></p><p><strong><span style="color:#c00000;">            }</span></strong></p><p>            catch (XMPPException e)</p><p>            {</p><p>                e.printStackTrace();</p><p>            }</p><p><br></p><p>            return Long.valueOf(0);</p><p>         }</p><p>     }</p></td> </tr> </tbody> </table> <p style="margin-left:28px;"><br></p> <p style="margin-left:56px;">c)<span style="font-family:'宋体';">最终在服务端的数据库中可以看到如下数据(其中可以看到用户昵称也都设置成功了):</span></p> <p style="margin-left:56px;"><span style="font-family:'宋体';"><a href="http://img.e-com-net.com/image/info3/e9e34b1c665f4985b4578d0c9501858d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info3/e9e34b1c665f4985b4578d0c9501858d.jpg" title="0001.png" alt="在 Android 的 IM 应用中使用 asmack 库实现用户头像的传输(基于VCard协议)_第1张图片" width="650" height="376" style="border:1px solid black;"></a></span></p> <p style="margin-top:16px;margin-bottom:16px;margin-left:56px;">d)<span style="font-family:'宋体';">通过</span>spark<span style="font-family:'宋体';">登录成功后,可以看到头像已经更新如下:</span></p> <p style="margin-top:16px;margin-bottom:16px;margin-left:28px;">    <a href="http://img.e-com-net.com/image/info3/4f05586fd2ca49658016984620072c6f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info3/4f05586fd2ca49658016984620072c6f.jpg" title="003.png" alt="在 Android 的 IM 应用中使用 asmack 库实现用户头像的传输(基于VCard协议)_第2张图片" width="206" height="104" style="border:1px solid black;"></a></p> <span></span> <p style="margin-top:16px;margin-bottom:16px;margin-left:24px;"><strong>2,<span style="font-family:'宋体';">查看用户</span>blue<span style="font-family:'宋体';">的</span>VCard<span style="font-family:'宋体';">信息</span></strong></p> <p style="margin-top:16px;margin-bottom:16px;margin-left:56px;">a)<span style="font-family:'宋体';">首先确认</span>ProviderManager<span style="font-family:'宋体';">已经加入</span>vcard-temp<span style="font-family:'宋体';">,同上;</span></p> <p style="margin-top:16px;margin-bottom:16px;margin-left:56px;">b)<span style="font-family:'宋体';">采用异步任务来获取用户</span>blue<span style="font-family:'宋体';">的</span>VCard<span style="font-family:'宋体';">信息中的昵称</span></p> <table style="width:703px;"> <tbody> <tr> <td width="568" valign="top" style="border-color:#000000;border-width:1px;padding:0px 7px;"><p>     public class GetVCardTask extends AsyncTask<String, Integer,  Long></p><p>     {</p><p>         @Override</p><p>         protected Long doInBackground(String... params)</p><p>         {</p><p>            if (params.length < 1) {</p><p>                return Long.valueOf(-1);</p><p>            }</p><p><br></p><p><strong><span style="color:#00b050;">// </span></strong><strong><span style="font-family:'宋体';color:#00b050;">获取用户</span><span style="color:#00b050;"> params[0] </span></strong><strong><span style="font-family:'宋体';color:#00b050;">的</span><span style="color:#00b050;"> vcard </span></strong><strong><span style="font-family:'宋体';color:#00b050;">信息</span></strong></p><p>            try</p><p>            {</p><p><strong><span style="color:#00b050;">// load(Connection connection, String  user)</span></strong></p><p style="text-indent:112px;"><strong><span style="color:#c00000;">vcard.load(MainHelloIM.getInstance().getConnection(),  params[0]);</span></strong></p><p>                Log.d(TAG, "nickname:  " + vcard.getNickName());</p><p>            }</p><p>            catch (XMPPException e)</p><p>            {</p><p>                e.printStackTrace();</p><p>                 return Long.valueOf(-2);</p><p>            }</p><p><br></p><p>            return Long.valueOf(0);</p><p>         }</p></td> </tr> </tbody> </table> <p style="margin-top:16px;margin-bottom:16px;"><br></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1209375110440521728"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(android,vcard,avatar,移动客户端)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835513699826233344.htm" title="android系统selinux中添加新属性property" target="_blank">android系统selinux中添加新属性property</a> <span class="text-muted">辉色投像</span> <div>1.定位/android/system/sepolicy/private/property_contexts声明属性开头:persist.charge声明属性类型:u:object_r:system_prop:s0图12.定位到android/system/sepolicy/public/domain.te删除neverallow{domain-init}default_prop:property</div> </li> <li><a href="/article/1835470119195734016.htm" title="2.2.6 通知类控件 Toast、Menu" target="_blank">2.2.6 通知类控件 Toast、Menu</a> <span class="text-muted">常思行</span> <div>本文例程下载:WillFlow_Toast、WillFlowMenu一、什么是Toast?Toast也被叫做吐司,是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,它有如下两个特点:Toast是没有焦点的Toast显示的时间有限过一定的时间就会自动消失所以一般来讲Toast的使用并不会影响我们的正常操作,并且它通常不会占用太大的屏幕空间,有着良好的用户体</div> </li> <li><a href="/article/1835450889452744704.htm" title="mac 备份android 手机通讯录导入iphone,iphone如何导出通讯录(轻松教你iPhone备份通讯录的方法)..." target="_blank">mac 备份android 手机通讯录导入iphone,iphone如何导出通讯录(轻松教你iPhone备份通讯录的方法)...</a> <span class="text-muted">weixin_39762838</span> <a class="tag" taget="_blank" href="/search/mac/1.htm">mac</a><a class="tag" taget="_blank" href="/search/%E5%A4%87%E4%BB%BDandroid/1.htm">备份android</a><a class="tag" taget="_blank" href="/search/%E6%89%8B%E6%9C%BA%E9%80%9A%E8%AE%AF%E5%BD%95%E5%AF%BC%E5%85%A5iphone/1.htm">手机通讯录导入iphone</a> <div>在日新月异的手机更替中,换手机已经成为一个非常稀松平常的事情,但将旧手机上面的通讯录导入到新手机还是让不少小伙伴为难,本篇将给大家详细讲解这方面的知识:“苹果手机通讯录怎么导入到新手机”及“安卓手机通讯录导入到新手机”的方法。一、苹果手机通讯录导入到新手机常用方法(SIM卡导入)在苹果手机主频幕上找到“设置”,单击进入设置菜单,下拉菜单列表,点击“邮件、通讯录、日历”,然后找到“导入SIM卡通讯录</div> </li> <li><a href="/article/1835450511071997952.htm" title="android 更改窗口的层次,浮窗开发之窗口层级" target="_blank">android 更改窗口的层次,浮窗开发之窗口层级</a> <span class="text-muted">Ms.Bu</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E6%9B%B4%E6%94%B9%E7%AA%97%E5%8F%A3%E7%9A%84%E5%B1%82%E6%AC%A1/1.htm">更改窗口的层次</a> <div>最近在项目中遇到了这样的需求:需要在特定的其他应用之上悬浮自己的UI交互(拖动、输入等复杂的UI交互),和九游的浮窗类似,不过我们的比九游的体验更好,我们越过了很多授权的限制。浮窗效果很多人都知道如何去实现一个简单的浮窗,但是却很少有人去深入的研究背后的流程机制,由于项目中浮窗交互比较复杂,遇到了些坑查看了很多资料,故总结浮窗涉及到的知识点:窗口层级关系(浮窗是如何“浮”的)?浮窗有哪些限制,如何</div> </li> <li><a href="/article/1835448619277316096.htm" title="Android应用性能优化" target="_blank">Android应用性能优化</a> <span class="text-muted">轻口味</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a> <div>Android手机由于其本身的后台机制和硬件特点,性能上一直被诟病,所以软件开发者对软件本身的性能优化就显得尤为重要;本文将对Android开发过程中性能优化的各个方面做一个回顾与总结。Cache优化ListView缓存:ListView中有一个回收器,Item滑出界面的时候View会回收到这里,需要显示新的Item的时候,就尽量重用回收器里面的View;每次在getView函数中inflate新</div> </li> <li><a href="/article/1835412764722556928.htm" title="Android实现监听事件的方法" target="_blank">Android实现监听事件的方法</a> <span class="text-muted">Amy木婉清</span> <div>1.通过内部类实现2.通过匿名内部类实现3.通过事件源所在类实现4.通过外部类实现5.布局文件中onclick属性(针对点击事件)1.通过内部类实现代码:privateButtonmBtnEvent;//oncreate中mBtnEvent.setOnClickListener(newOnClick());//内部类实现监听classOnClickimplementsView.OnClickLis</div> </li> <li><a href="/article/1835400203130204160.htm" title="高级UI<第二十四篇>:Android中用到的矩阵常识" target="_blank">高级UI<第二十四篇>:Android中用到的矩阵常识</a> <span class="text-muted">NoBugException</span> <div>(1)定义在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。由m×n个数aij排成的m行n列的数表称为m行n列的矩阵,简称m×n矩阵。记作:图片.png这m×n个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数aij为(i,j)元的矩阵可记为(aij)或(aij)m×n,m×n矩阵A也记作Amn。元素是实数的矩阵称为实矩阵,元素是复</div> </li> <li><a href="/article/1835398694636187648.htm" title="RK3229_Android9.0_Box 4G模块EC200A调试" target="_blank">RK3229_Android9.0_Box 4G模块EC200A调试</a> <span class="text-muted">suifen_</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>0、kernel修改这部分完全可以参考Linux的移植:RK3588EC200A-CN【4G模块】调试_rkec200a-cn-CSDN博客1、修改device/rockchip/rk322xdiff--gita/device.mkb/device.mkindexec6bfaa..e7c32d1100755---a/device.mk+++b/device.mk@@-105,6+105,8@@en</div> </li> <li><a href="/article/1835374864970641408.htm" title="kt文件和java文件_Java与Kotlin之间怎样进行互操作" target="_blank">kt文件和java文件_Java与Kotlin之间怎样进行互操作</a> <span class="text-muted">铭空间</span> <a class="tag" taget="_blank" href="/search/kt%E6%96%87%E4%BB%B6%E5%92%8Cjava%E6%96%87%E4%BB%B6/1.htm">kt文件和java文件</a> <div>Java与Kotlin之间怎样进行互操作发布时间:2021-02-0210:50:43来源:亿速云阅读:98作者:小新这篇文章主要介绍了Java与Kotlin之间怎样进行互操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言目前kotlin是谷歌首推的开发Android的语言,但由于历史原因,我们绝大部分项目依旧还是以Java为主</div> </li> <li><a href="/article/1835369316342657024.htm" title="Android shell 常用 debug 命令" target="_blank">Android shell 常用 debug 命令</a> <span class="text-muted">晨春计</span> <a class="tag" taget="_blank" href="/search/Audio/1.htm">Audio</a><a class="tag" taget="_blank" href="/search/debug/1.htm">debug</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>目录1、查看版本2、am命令3、pm命令4、dumpsys命令5、sed命令6、log定位查看APK进程号7、log定位使用场景1、查看版本1.1、Android串口终端执行getpropro.build.version.release#获取Android版本uname-a#查看linux内核版本信息uname-r#单独查看内核版本1.2、linux服务器执行lsb_release-a#查看Lin</div> </li> <li><a href="/article/1835332133149831168.htm" title="2024年最全Flutter如何和Native通信-Android视角,Electron开发Android界面" target="_blank">2024年最全Flutter如何和Native通信-Android视角,Electron开发Android界面</a> <span class="text-muted">2401_84544531</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>总结【Android详细知识点思维脑图(技能树)】其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然Android没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明Android中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪</div> </li> <li><a href="/article/1835288964056051712.htm" title="分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)" target="_blank">分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)</a> <span class="text-muted">计算机源码社</span> <a class="tag" taget="_blank" href="/search/Python%E9%A1%B9%E7%9B%AE/1.htm">Python项目</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E9%80%89%E9%A2%98/1.htm">计算机毕业设计选题</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E6%BA%90%E7%A0%81/1.htm">计算机毕业设计源码</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/spark%E6%AF%95%E8%AE%BE/1.htm">spark毕设</a> <div>作者:计算机源码社个人简介:本人八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!学习资料、程序开发、技术解答、文档报告如需要源码,可以扫取文章下方二维码联系咨询Java项目微信小程序项目Android项目Python项目PHP项目ASP.NET项目Node.js项目选题推荐项目实战|p</div> </li> <li><a href="/article/1835230728099557376.htm" title="android ndk 开发jni调用对象方法,数组参数" target="_blank">android ndk 开发jni调用对象方法,数组参数</a> <span class="text-muted">wulongkou</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E9%97%AE%E9%A2%98/1.htm">开发问题</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%8D%93%E7%9A%84%E4%BA%8B/1.htm">安卓的事</a><a class="tag" taget="_blank" href="/search/ndk/1.htm">ndk</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/jni/1.htm">jni</a> <div>一、JNI和NDK关系JNI是Java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。JNI是本地编程接口,Java和C/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动</div> </li> <li><a href="/article/1835224173648113664.htm" title="Android jni中数组参数的传递方式" target="_blank">Android jni中数组参数的传递方式</a> <span class="text-muted">lokeyme</span> <a class="tag" taget="_blank" href="/search/Andriod/1.htm">Andriod</a><a class="tag" taget="_blank" href="/search/android%E5%BC%80%E5%8F%91/1.htm">android开发</a><a class="tag" taget="_blank" href="/search/JNI/1.htm">JNI</a><a class="tag" taget="_blank" href="/search/NDK/1.htm">NDK</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>1、背景今天调试了一下Androidjni关于Java中调用C代码的程序,发现我的数组参数传递方式不对,导致值传递不正确,我的方法是:C代码,入口函数#include#includejintJava_sony_MedicalRecordDemo_MainActivity_decryptionSuccess(JNIEnv*env,jobjectthiz,jintAttr[]){returnAttr[</div> </li> <li><a href="/article/1835197073578881024.htm" title="1-1.Jetpack 之 Navigation 简单编码模板" target="_blank">1-1.Jetpack 之 Navigation 简单编码模板</a> <span class="text-muted">我命由我12345</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/-/1.htm">-</a><a class="tag" taget="_blank" href="/search/Jetpack/1.htm">Jetpack</a><a class="tag" taget="_blank" href="/search/%E7%AE%80%E5%8C%96%E7%BC%96%E7%A8%8B/1.htm">简化编程</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java-ee/1.htm">java-ee</a><a class="tag" taget="_blank" href="/search/android-studio/1.htm">android-studio</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%8D%93/1.htm">安卓</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/jetpack/1.htm">jetpack</a> <div>一、Navigation1、Navigation概述Navigation是Jetpack中的一个重要成员,它主要是结合导航图(NavigationGraph)来控制和简化Fragment之间的导航,即往哪里走,该怎么走2、Navigate引入在模块级build.gradle中引入相关依赖implementation'androidx.navigation:navigation-fragment:2</div> </li> <li><a href="/article/1835139546212298752.htm" title="Android JetPack架构——结合记事本Demo一篇打通对Sqlite的增删改查结合常用jetpack架构应用" target="_blank">Android JetPack架构——结合记事本Demo一篇打通对Sqlite的增删改查结合常用jetpack架构应用</a> <span class="text-muted">erhtre</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/jetpack/1.htm">jetpack</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/sqlite/1.htm">sqlite</a> <div>为什么要用Jetpack?========================================================================关于为什么要用Jetpack,我参考了许多的博客和官方文档,开阔了我对Android生态圈的理解和认识,在Jetpack推出前出现的许许多多强大的第三方框架与语言,典型代表无疑是强大的RxJava在Jetpack仍然有许多粉丝在一</div> </li> <li><a href="/article/1835139294000410624.htm" title="Android干净架构MVI模板使用指南" target="_blank">Android干净架构MVI模板使用指南</a> <span class="text-muted">井美婵Toby</span> <div>Android干净架构MVI模板使用指南android-clean-architecture-mvi-boilerplateAforkofourcleanarchitectureboilerplateusingtheModel-View-Intentpattern项目地址:https://gitcode.com/gh_mirrors/an/android-clean-architecture-mv</div> </li> <li><a href="/article/1835136270758670336.htm" title="⭐Unity 安卓环境中正确地读取和处理 XML 文件" target="_blank">⭐Unity 安卓环境中正确地读取和处理 XML 文件</a> <span class="text-muted">惊鸿醉</span> <a class="tag" taget="_blank" href="/search/Unity/1.htm">Unity</a><a class="tag" taget="_blank" href="/search/unity/1.htm">unity</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>写了一个选择题Demo,电脑包和编辑器内无问题,但是打包安卓手机之后题目无法正常使用,想到的是安卓环境中正确地读取文件的问题改进方案:1.由于XmlDocument.Load方法在Android上的路径问题(由于文件位于APK内部,无法像在文件系统中那样直接访问),需要先使用UnityWebRequest来异步加载文件内容,然后再解析XML。2.异步处理:修改你的代码,以支持异步文件加载和处理,这</div> </li> <li><a href="/article/1835128195632951296.htm" title="《Android进阶之光》读书笔记" target="_blank">《Android进阶之光》读书笔记</a> <span class="text-muted">soleil雪寂</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Android%E8%BF%9B%E9%98%B6%E4%B9%8B%E5%85%89/1.htm">Android进阶之光</a> <div>文章目录第1章Android新特性1.1.Android5.0新特性1.2.RecyclerView1.1.4.3种Notification1.1.5.Toolbar与Palette1.1.6.Palette1.2.Android6.0新特性1.2.2.运行时权限机制1.3.Android7.0新特性第2章MaterialDesign2.2.DesignSupportLibrary常用控件详解第3</div> </li> <li><a href="/article/1835126172099375104.htm" title="《Android进阶之光》— Android 书籍" target="_blank">《Android进阶之光》— Android 书籍</a> <span class="text-muted">王睿丶</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">永无止境</a><a class="tag" taget="_blank" href="/search/%E3%80%8AAndroid%E8%BF%9B%E9%98%B6%E4%B9%8B%E5%85%89%E3%80%8B/1.htm">《Android进阶之光》</a><a class="tag" taget="_blank" href="/search/Android%E4%B9%A6%E7%B1%8D/1.htm">Android书籍</a><a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/phoenix/1.htm">phoenix</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a> <div>文章目录第1章Android新特性1第2章MaterialDesign48第3章View体系与自定义View87第4章多线程编程165第5章网络编程与网络框架204第6章设计模式271第7章事件总线308第8章函数响应式编程333第9章注解与依赖注入框架382第10章应用架构设计422第11章系统架构与MediaPlayer框架460出版年:2017-7简介:《Android进阶之光》是一本And</div> </li> <li><a href="/article/1835123902771195904.htm" title="《android进阶之光》——多线程编程(上)" target="_blank">《android进阶之光》——多线程编程(上)</a> <span class="text-muted">TAING要一直努力</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a> <div>今天了解了下多线程编程,知识点如下:进程与线程:进程是什么?线程是什么?进程可以看作是程序的实体,是线程的容器,是受操作系统管理的基本运行单元,例如exe文件就是一个进程。线程是进程运行的一些子任务,是操作系统调度的最小单元,各线程拥有自己的计数器,堆栈,局部变量等,也可以访问线程间共享的内存。线程的状态有哪些?新创建,可运行,等待,超时等待,阻塞,终止怎么创建一个线程?-三种方法第一种,MyTr</div> </li> <li><a href="/article/1835118105613922304.htm" title="android进阶之光!Android面试必备的集合源码详解,系列篇" target="_blank">android进阶之光!Android面试必备的集合源码详解,系列篇</a> <span class="text-muted">程序员Sunbu</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a> <div>前言面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责。文末会给大家分享下我整理的Android面试专题及答案其中大部分都是大企业面试常问的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖全部方式,不过对大家找工作肯定是有帮助!本月飞机到达上海,到今天第6天了,四家大公司华为,小米,映客,抖音,还有二家中小型公司。有几家已经面了几轮,下周还要面,挂了几家,不过目前已经选择了</div> </li> <li><a href="/article/1835094160550490112.htm" title="Android-悬浮窗功能的实现(附Java、KT实现源码)(1)" target="_blank">Android-悬浮窗功能的实现(附Java、KT实现源码)(1)</a> <span class="text-muted">egrhef</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>//获取服务的操作对象valbinder=serviceasFloatWinfowServices.MyBinderbinder.service}overridefunonServiceDisconnected(name:ComponentName){}}overridefunonActivityResult(requestCode:Int,resultCode:Int,data:Intent){</div> </li> <li><a href="/article/1835061636268912640.htm" title="Visual Studio中的Android模拟器使用详解" target="_blank">Visual Studio中的Android模拟器使用详解</a> <span class="text-muted">wurui8</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/android%E5%BA%94%E7%94%A8/1.htm">android应用</a> <div>关注微信号:javalearns随时随地学Java或扫一扫随时随地学JavaMicrosoft本周发布了VisualStudio2015预览版,里面包含Android开发工具.安装的时候,如果选Android开发,VisualStudio会把调试Android应用程序用的VisualStudio模拟器也装上.在介绍这个新模拟器之前,我们先来聊一聊,为什么需要一个新的Android模拟器–当然,你也</div> </li> <li><a href="/article/1835057219947819008.htm" title="Unity 热更 之 【HybirdCLR】+【YooAsset】 [安卓 Android端] [代码 + 资源热更] 功能的 简单实现演示" target="_blank">Unity 热更 之 【HybirdCLR】+【YooAsset】 [安卓 Android端] [代码 + 资源热更] 功能的 简单实现演示</a> <span class="text-muted">仙魁XAN</span> <a class="tag" taget="_blank" href="/search/Unity/1.htm">Unity</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E9%98%B6/1.htm">进阶</a><a class="tag" taget="_blank" href="/search/unity/1.htm">unity</a><a class="tag" taget="_blank" href="/search/HybirdCLR/1.htm">HybirdCLR</a><a class="tag" taget="_blank" href="/search/YooAsset/1.htm">YooAsset</a><a class="tag" taget="_blank" href="/search/HotUpdate/1.htm">HotUpdate</a><a class="tag" taget="_blank" href="/search/%E7%83%AD%E6%9B%B4%E6%96%B0/1.htm">热更新</a> <div>Unity热更之【HybirdCLR】+【YooAsset】[安卓Android端][代码+资源热更]功能的简单实现演示目录Unity热更之【HybirdCLR】+【YooAsset】[安卓Android端][代码+资源热更]功能的简单实现演示一、简单介绍二、HybridCLR三、YooAsset四、HybirdCLR引入工程五、YooAsset引入工程六、Python服务器简单构建七、Hybir</div> </li> <li><a href="/article/1835053685592387584.htm" title="Android 用线程池实现一个简单的任务队列(Kotlin)" target="_blank">Android 用线程池实现一个简单的任务队列(Kotlin)</a> <span class="text-muted">深海呐</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Android%E8%BF%9B%E9%98%B6/1.htm">Android进阶</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Kotlin/1.htm">Kotlin</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0/1.htm">线程池</a><a class="tag" taget="_blank" href="/search/%E5%BB%B6%E6%97%B6%E4%BB%BB%E5%8A%A1%E9%98%9F%E5%88%97/1.htm">延时任务队列</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%BB%B6%E6%97%B6%E4%BB%BB%E5%8A%A1/1.htm">线程池延时任务</a> <div>关于线程池,Kotlin和java的使用方式一样在Android中,很多人喜欢用Handler的postDelayed()去实现延时任务.要使用postDelayed(),去实现延时任务队列,就不可避免要使用递归.但是这样做,代码的简洁性,和书写的简易,就远不如使用线程池.使用线程池的简单程度:privatevalmThreadPool=Executors.newSingleThreadSched</div> </li> <li><a href="/article/1835053432449363968.htm" title="(小白入门)Windows环境下搭建React Native Android开发环境" target="_blank">(小白入门)Windows环境下搭建React Native Android开发环境</a> <span class="text-muted">码农老黑</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/Native/1.htm">Native</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a><a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a> <div>ReactNative(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的UI框架React在原生移动应用平台的衍生产物,目前支持iOS和Android两大平台。RN的环境搭建在RN的中文社区有所介绍,但是对于小白来说还是有些太过简略了。RN中文社区详见参考,本文不涉及的问题也许在其中能够有所解答。ReactNative思想底层引擎是JavaSc</div> </li> <li><a href="/article/1835051666974535680.htm" title="Android Dialog圆角设置无效的问题" target="_blank">Android Dialog圆角设置无效的问题</a> <span class="text-muted">ly969434341</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>一,参考AndroidDialog圆角设置无效的问题https://blog.csdn.net/woshi_awei/article/details/99664527Android自定义Dialog实现通用圆角对话框https://cloud.tencent.com/developer/article/1740956二,原因Diallog的默认背景是白色(直角背景),我自定义的Dialog背景也是</div> </li> <li><a href="/article/1835050659297193984.htm" title="MultiSnapRecyclerView:让Android RecyclerView的滚动停靠更灵活" target="_blank">MultiSnapRecyclerView:让Android RecyclerView的滚动停靠更灵活</a> <span class="text-muted">技术无疆</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/android-studio/1.htm">android-studio</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/androidx/1.htm">androidx</a> <div>在Android应用开发中,RecyclerView是一个强大且灵活的组件,用于展示大量数据集合。然而,标准的RecyclerView只支持单一的滚动停靠点,这在某些场景下可能不够灵活。为了解决这个问题,TakuSemba开发了一个名为MultiSnapRecyclerView的库,它允许开发者在RecyclerView中实现多个滚动停靠点。文章目录什么是MultiSnapRecyclerView</div> </li> <li><a href="/article/1835050154282020864.htm" title="Android界面特效全汇总" target="_blank">Android界面特效全汇总</a> <span class="text-muted">小飞鹤</span> <a class="tag" taget="_blank" href="/search/Android%E5%BC%80%E5%8F%91%E8%AF%A6%E8%A7%A3/1.htm">Android开发详解</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>(一)Activity页面切换的效果Android2.0之后有了overridePendingTransition(),其中里面两个参数,一个是前一个activity的退出两一个activity的进入,Java代码1.@OverridepublicvoidonCreate(BundlesavedInstanceState){2.super.onCreate(savedInstanceState);</div> </li> <li><a href="/article/109.htm" title="统一思想认识" target="_blank">统一思想认识</a> <span class="text-muted">永夜-极光</span> <a class="tag" taget="_blank" href="/search/%E6%80%9D%E6%83%B3/1.htm">思想</a> <div>1.统一思想认识的基础,才能有的放矢  原因:    总有一种描述事物的方式最贴近本质,最容易让人理解.    如何让教育更轻松,在于找到最适合学生的方式.          难点在于,如何模拟对方的思维基础选择合适的方式.   &</div> </li> <li><a href="/article/236.htm" title="Joda Time使用笔记" target="_blank">Joda Time使用笔记</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/joda+time/1.htm">joda time</a> <div>Joda Time的介绍可以参考这篇文章: http://www.ibm.com/developerworks/cn/java/j-jodatime.html 工作中也常常用到Joda Time,为了避免每次使用都查API,记录一下常用的用法:     /** * DateTime变化(增减) */ @Tes</div> </li> <li><a href="/article/363.htm" title="FileUtils API" target="_blank">FileUtils API</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/FileUtils/1.htm">FileUtils</a><a class="tag" taget="_blank" href="/search/FileUtils+API/1.htm">FileUtils API</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2217374 一、概述 这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到。 非常的好用。 </div> </li> <li><a href="/article/490.htm" title="各种新兴技术" target="_blank">各种新兴技术</a> <span class="text-muted">不懂事的小屁孩</span> <a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF/1.htm">技术</a> <div>1:gradle Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。 现在构建系统常用到maven工具,现在有更容易上手的gradle, 搭建java环境: http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 搭建android环境: http://m</div> </li> <li><a href="/article/617.htm" title="tomcat6的https双向认证" target="_blank">tomcat6的https双向认证</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/tomcat6/1.htm">tomcat6</a> <div>1.生成服务器端证书 keytool -genkey -keyalg RSA -dname "cn=localhost,ou=sango,o=none,l=china,st=beijing,c=cn" -alias server -keypass password -keystore server.jks -storepass password -validity 36</div> </li> <li><a href="/article/744.htm" title="托管虚拟桌面市场势不可挡" target="_blank">托管虚拟桌面市场势不可挡</a> <span class="text-muted">蓝儿唯美</span> <div>用户还需要冗余的数据中心,dinCloud的高级副总裁兼首席营销官Ali Din指出。该公司转售一个MSP可以让用户登录并管理和提供服务的用于DaaS的云自动化控制台,提供服务或者MSP也可以自己来控制。 在某些情况下,MSP会在dinCloud的云服务上进行服务分层,如监控和补丁管理。 MSP的利润空间将根据其参与的程度而有所不同,Din说。 “我们有一些合作伙伴负责将我们推荐给客户作为个</div> </li> <li><a href="/article/871.htm" title="spring学习——xml文件的配置" target="_blank">spring学习——xml文件的配置</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>在Spring的学习中,对于其xml文件的配置是必不可少的。在Spring的多种装配Bean的方式中,采用XML配置也是最常见的。以下是一个简单的XML配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.or</div> </li> <li><a href="/article/998.htm" title="HDU 4342 History repeat itself 模拟" target="_blank">HDU 4342 History repeat itself 模拟</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E6%A8%A1%E6%8B%9F/1.htm">模拟</a> <div>来源:http://acm.hdu.edu.cn/showproblem.php?pid=4342 题意:首先让求第几个非平方数,然后求从1到该数之间的每个sqrt(i)的下取整的和。 思路:一个简单的模拟题目,但是由于数据范围大,需要用__int64。我们可以首先把平方数筛选出来,假如让求第n个非平方数的话,看n前面有多少个平方数,假设有x个,则第n个非平方数就是n+x。注意两种特殊情况,即</div> </li> <li><a href="/article/1125.htm" title="java中最常用jar包的用途" target="_blank">java中最常用jar包的用途</a> <span class="text-muted">asia007</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>java中最常用jar包的用途 jar包用途axis.jarSOAP引擎包commons-discovery-0.2.jar用来发现、查找和实现可插入式接口,提供一些一般类实例化、单件的生命周期管理的常用方法.jaxrpc.jarAxis运行所需要的组件包saaj.jar创建到端点的点到点连接的方法、创建并处理SOAP消息和附件的方法,以及接收和处理SOAP错误的方法.  w</div> </li> <li><a href="/article/1252.htm" title="ajax获取Struts框架中的json编码异常和Struts中的主控制器异常的解决办法" target="_blank">ajax获取Struts框架中的json编码异常和Struts中的主控制器异常的解决办法</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/json%E7%BC%96%E7%A0%81%E8%BF%94%E5%9B%9E%E5%BC%82%E5%B8%B8/1.htm">json编码返回异常</a> <div>一:ajax获取自定义Struts框架中的json编码  出现以下 问题:       1,强制flush输出  json编码打印在首页 2, 不强制flush js会解析json 打印出来的是错误的jsp页面   却没有跳转到错误页面 3,  ajax中的dataType的json 改为text 会</div> </li> <li><a href="/article/1379.htm" title="JUnit使用的设计模式" target="_blank">JUnit使用的设计模式</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/JUnit/1.htm">JUnit</a> <div>JUnit源代码涉及使用了大量设计模式 1、模板方法模式(Template Method)         定义一个操作中的算法骨架,而将一些步骤延伸到子类中去,使得子类可以不改变一个算法的结构,即可重新定义该算法的某些特定步骤。这里需要复用的是算法的结构,也就是步骤,而步骤的实现可以在子类中完成。   </div> </li> <li><a href="/article/1506.htm" title="Linux常用命令(摘录)" target="_blank">Linux常用命令(摘录)</a> <span class="text-muted">sunjing</span> <a class="tag" taget="_blank" href="/search/crond/1.htm">crond</a><a class="tag" taget="_blank" href="/search/chkconfig/1.htm">chkconfig</a> <div>chkconfig --list   查看linux所有服务 chkconfig --add servicename 添加linux服务 netstat -apn | grep 8080  查看端口占用 env 查看所有环境变量 echo $JAVA_HOME 查看JAVA_HOME环境变量   安装编译器 yum install -y gcc</div> </li> <li><a href="/article/1633.htm" title="【Hadoop一】Hadoop伪集群环境搭建" target="_blank">【Hadoop一】Hadoop伪集群环境搭建</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div> 结合网上多份文档,不断反复的修正hadoop启动和运行过程中出现的问题,终于把Hadoop2.5.2伪分布式安装起来,跑通了wordcount例子。Hadoop的安装复杂性的体现之一是,Hadoop的安装文档非常多,但是能一个文档走下来的少之又少,尤其是Hadoop不同版本的配置差异非常的大。Hadoop2.5.2于前两天发布,但是它的配置跟2.5.0,2.5.1没有分别。 &nb</div> </li> <li><a href="/article/1760.htm" title="Anychart图表系列五之事件监听" target="_blank">Anychart图表系列五之事件监听</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/chart/1.htm">chart</a> <div>创建图表事件监听非常简单:首先是通过addEventListener('监听类型',js监听方法)添加事件监听,然后在js监听方法中定义具体监听逻辑。 以钻取操作为例,当用户点击图表某一个point的时候弹出point的name和value,代码如下: <script> //创建AnyChart var chart = new AnyChart(); //添加钻取操作&quo</div> </li> <li><a href="/article/1887.htm" title="Web前端相关段子" target="_blank">Web前端相关段子</a> <span class="text-muted">braveCS</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF/1.htm">web前端</a> <div>Web标准:结构、样式和行为分离   使用语义化标签 0)标签的语义:使用有良好语义的标签,能够很好地实现自我解释,方便搜索引擎理解网页结构,抓取重要内容。去样式后也会根据浏览器的默认样式很好的组织网页内容,具有很好的可读性,从而实现对特殊终端的兼容。 1)div和span是没有语义的:只是分别用作块级元素和行内元素的区域分隔符。当页面内标签无法满足设计需求时,才会适当添加div</div> </li> <li><a href="/article/2014.htm" title="编程之美-24点游戏" target="_blank">编程之美-24点游戏</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; public class PointGame { /**编程之美 </div> </li> <li><a href="/article/2141.htm" title="主页面子页面传值总结" target="_blank">主页面子页面传值总结</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/%E6%80%BB%E7%BB%93/1.htm">总结</a> <div>1、showModalDialog returnValue是javascript中html的window对象的属性,目的是返回窗口值,当用window.showModalDialog函数打开一个IE的模式窗口时,用于返回窗口的值 主界面 var sonValue=window.showModalDialog("son.jsp"); 子界面 window.retu</div> </li> <li><a href="/article/2268.htm" title="[网络与经济]互联网+的含义" target="_blank">[网络与经济]互联网+的含义</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91%2B/1.htm">互联网+</a> <div>       互联网+后面是一个人的名字 = 网络控制系统       互联网+你的名字 =  网络个人数据库       每日提示:如果人觉得不舒服,千万不要外出到处走动,就呆在床上,玩玩手游,更不能够去开车,现在交通状况不</div> </li> <li><a href="/article/2395.htm" title="oracle 创建视图 with check option" target="_blank">oracle 创建视图 with check option</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/%E8%A7%86%E5%9B%BE/1.htm">视图</a><a class="tag" taget="_blank" href="/search/view/1.htm">view</a><a class="tag" taget="_blank" href="/search/oralce/1.htm">oralce</a> <div>我们来看下面的例子: create or replace view testview as select empno,ename from emp where ename like ‘M%’ with check option; 这里我们创建了一个视图,并使用了with check option来限制了视图。 然后我们来看一下视图包含的结果: select * from testv</div> </li> <li><a href="/article/2522.htm" title="ToastPlugin插件在cordova3.3下使用" target="_blank">ToastPlugin插件在cordova3.3下使用</a> <span class="text-muted">dibov</span> <a class="tag" taget="_blank" href="/search/Cordova/1.htm">Cordova</a> <div>    自己开发的Todos应用,想实现“ 再按一次返回键退出程序 ”的功能,采用网上的ToastPlugins插件,发现代码或文章基本都是老版本,运行问题比较多。折腾了好久才弄好。下面吧基于cordova3.3下的ToastPlugins相关代码共享。       ToastPlugin.java package&nbs</div> </li> <li><a href="/article/2649.htm" title="C语言22个系统函数" target="_blank">C语言22个系统函数</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/function/1.htm">function</a> <div>C语言系统函数一、数学函数下列函数存放在math.h头文件中Double floor(double num) 求出不大于num的最大数。Double fmod(x, y) 求整数x/y的余数。Double frexp(num, exp); double num; int *exp; 将num分为数字部分(尾数)x和 以2位的指数部分n,即num=x*2n,指数n存放在exp指向的变量中,返回x。D</div> </li> <li><a href="/article/2776.htm" title="开发一个类的流程" target="_blank">开发一个类的流程</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91/1.htm">开发</a> <div>本人近日根据自己的开发经验总结了一个类的开发流程。这个流程适用于单独开发的构件,并不适用于对一个项目中的系统对象开发。开发出的类可以存入私人类库,供以后复用。   以下是开发流程: 1. 明确类的功能,抽象出类的大概结构 2. 初步设想类的接口 3. 类名设计(驼峰式命名) 4. 属性设置(权限设置) 判断某些变量是否有必要作为成员属</div> </li> <li><a href="/article/2903.htm" title="java 并发" target="_blank">java 并发</a> <span class="text-muted">shuizhaosi888</span> <a class="tag" taget="_blank" href="/search/java+%E5%B9%B6%E5%8F%91/1.htm">java 并发</a> <div>能够写出高伸缩性的并发是一门艺术   在JAVA SE5中新增了3个包 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 在java的内存模型中,类的实例字段、静态字段和构成数组的对象元素都会被多个线程所共享,局部变量与方法参数都是线程私有的,不会被共享。 </div> </li> <li><a href="/article/3030.htm" title="Spring Security(11)——匿名认证" target="_blank">Spring Security(11)——匿名认证</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a><a class="tag" taget="_blank" href="/search/ROLE_ANNOYMOUS/1.htm">ROLE_ANNOYMOUS</a><a class="tag" taget="_blank" href="/search/%E5%8C%BF%E5%90%8D/1.htm">匿名</a> <div>匿名认证 目录 1.1     配置 1.2     AuthenticationTrustResolver          对于匿名访问的用户,Spring Security支持为其建立一个匿名的AnonymousAuthenticat</div> </li> <li><a href="/article/3157.htm" title="NODEJS项目实践0.2[ express,ajax通信...]" target="_blank">NODEJS项目实践0.2[ express,ajax通信...]</a> <span class="text-muted">逐行分析JS源代码</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a><a class="tag" taget="_blank" href="/search/express/1.htm">express</a> <div>  一、前言         通过上节学习,我们已经        ubuntu系统搭建了一个可以访问的nodejs系统,并做了nginx转发。本节原要做web端服务 及 mongodb的存取,但写着写着,web端就</div> </li> <li><a href="/article/3284.htm" title="在Struts2 的Action中怎样获取表单提交上来的多个checkbox的值" target="_blank">在Struts2 的Action中怎样获取表单提交上来的多个checkbox的值</a> <span class="text-muted">lhbthanks</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/checkbox/1.htm">checkbox</a> <div>第一种方法:获取结果String类型 在 Action 中获得的是一个 String 型数据,每一个被选中的 checkbox 的 value 被拼接在一起,每个值之间以逗号隔开(,)。 所以在 Action 中定义一个跟 checkbox 的 name 同名的属性来接收这些被选中的 checkbox 的 value 即可。 以下是实现的代码: 前台 HTML 代码: </div> </li> <li><a href="/article/3411.htm" title="003.Kafka基本概念" target="_blank">003.Kafka基本概念</a> <span class="text-muted">nweiren</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a> <div>Kafka基本概念:Topic、Partition、Message、Producer、Broker、Consumer。 Topic:             消息源(Message)的分类。 Partition:             Topic物理上的分组,一</div> </li> <li><a href="/article/3538.htm" title="Linux环境下安装JDK" target="_blank">Linux环境下安装JDK</a> <span class="text-muted">roadrunners</span> <a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1、准备工作 创建JDK的安装目录: mkdir -p /usr/java/   下载JDK,找到适合自己系统的JDK版本进行下载: http://www.oracle.com/technetwork/java/javase/downloads/index.html   把JDK安装包下载到/usr/java/目录,然后进行解压: tar -zxvf jre-7</div> </li> <li><a href="/article/3665.htm" title="Linux忘记root密码的解决思路" target="_blank">Linux忘记root密码的解决思路</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1:使用同版本的linux启动系统,chroot到忘记密码的根分区passwd改密码   2:grub启动菜单中加入init=/bin/bash进入系统,不过这时挂载的是只读分区。根据系统的分区情况进一步判断.   3: grub启动菜单中加入 single以单用户进入系统.   4:用以上方法mount到根分区把/etc/passwd中的root密码去除   例如:   ro</div> </li> <li><a href="/article/3792.htm" title="跨浏览器 HTML5 postMessage 方法以及 message 事件模拟实现" target="_blank">跨浏览器 HTML5 postMessage 方法以及 message 事件模拟实现</a> <span class="text-muted">xueyou</span> <a class="tag" taget="_blank" href="/search/jsonp/1.htm">jsonp</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>postMessage 是 HTML5 新方法,它可以实现跨域窗口之间通讯。到目前为止,只有 IE8+, Firefox 3, Opera 9, Chrome 3和 Safari 4 支持,而本篇文章主要讲述 postMessage 方法与 message 事件跨浏览器实现。postMessage 方法 JSONP 技术不一样,前者是前端擅长跨域文档数据即时通讯,后者擅长针对跨域服务端数据通讯,p</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>