<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>mrlsm的博客</title>
  <icon>https://www.gravatar.com/avatar/f434079a2c872465fdd9a55fa7754959</icon>
  <subtitle>每天做一件小事,就可以了</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://mrlsm.github.io/"/>
  <updated>2018-08-17T05:34:22.558Z</updated>
  <id>http://mrlsm.github.io/</id>
  
  <author>
    <name>Mr.lsm</name>
    <email>1057702942@qq.com</email>
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>hexo 如何添加自定义网页</title>
    <link href="http://mrlsm.github.io/2018/07/30/%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E9%A1%B5/"/>
    <id>http://mrlsm.github.io/2018/07/30/添加自定义网页/</id>
    <published>2018-07-30T04:12:12.000Z</published>
    <updated>2018-08-17T05:34:22.558Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Hexo自定义原理"><a href="#Hexo自定义原理" class="headerlink" title="Hexo自定义原理"></a>Hexo自定义原理</h3><p>Hexo 系列的博客中的文章都是经Hexo的主题渲染的静态网页。所以Hexo博客大部分都呈现出一种高度的统一化与规范化。不过 Hexo 提供了<strong>跳过渲染</strong>功能，使得我们可以直接在博客中放入自定义网页。</p><p>比如在博客中放入图片、自定义404.html、自定义About页面、简历等</p><h4 id="创建自定义网页"><a href="#创建自定义网页" class="headerlink" title="创建自定义网页"></a>创建自定义网页</h4><p>网页可以是自己编写的，也可以是别人现成的源码（下载喜欢的页面）。</p><p>网页编写完成后，在Hexo\source目录下创建一个文件夹（文件夹名称任意，比如我创建的是about这个文件夹，部署完成后，访问<a href="http://mrlsm.github.io/about即可看到效果，依此类推）">http://mrlsm.github.io/about即可看到效果，依此类推）</a></p><a id="more"></a><p>将 html 文件放置于此文件夹，并重命名为 index.html 。</p><p><img src="https://i.imgur.com/aO25qem.png" alt=""></p><h4 id="跳过渲染"><a href="#跳过渲染" class="headerlink" title="跳过渲染"></a>跳过渲染</h4><p>跳过渲染有下述两种方法：</p><ol><li>在html文件中添加跳过渲染指令</li></ol><blockquote><p>用编辑器打开放入\Hexo\source\创建的文件夹中的 index.html 文件，在开头添加如下代码即可</p></blockquote><pre><code>---layout: false---</code></pre><p>添加该指令后，执行 hexo g命令时便会跳过该 index.html文件，使得index.html不受当前 hexo 主题影响，完全是一个独立的网页，如果网页引用了 css 或 js，css 和 js 需使用外链或者将css js 文件放入index.html同目录下引用。</p><p>引用图片亦是如此</p><ol start="2"><li>在_config.yml文件中设置skip_render</li></ol><p>使用编辑器打开 Hexo 目录下的_config.yml文件，找到skip_render</p><p>skip_render一般有以下四种常用参数：</p><pre><code>跳过source目录下的 test.html: skip_render: test.html跳过source目录下 test 文件夹内所有文件：skip_render: test/*跳过source目录下 test 文件夹内所有文件包括子文件夹以及子文件夹内的文件：skip_render: test/**</code></pre><p>跳过多个路径：</p><pre><code>skip_render: - test.html - test/*</code></pre><p>添加完成后便不会渲染指定文件/文件夹。</p><ol start="3"><li>完成</li></ol><p>执行hexo g -d 发布，就可以在自己的网页上看到自定义页面了（可以制作一份自己的简历哦）。</p><p><img src="https://i.imgur.com/E0xwyv2.png" alt=""></p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;Hexo自定义原理&quot;&gt;&lt;a href=&quot;#Hexo自定义原理&quot; class=&quot;headerlink&quot; title=&quot;Hexo自定义原理&quot;&gt;&lt;/a&gt;Hexo自定义原理&lt;/h3&gt;&lt;p&gt;Hexo 系列的博客中的文章都是经Hexo的主题渲染的静态网页。所以Hexo博客大部分都呈现出一种高度的统一化与规范化。不过 Hexo 提供了&lt;strong&gt;跳过渲染&lt;/strong&gt;功能，使得我们可以直接在博客中放入自定义网页。&lt;/p&gt;
&lt;p&gt;比如在博客中放入图片、自定义404.html、自定义About页面、简历等&lt;/p&gt;
&lt;h4 id=&quot;创建自定义网页&quot;&gt;&lt;a href=&quot;#创建自定义网页&quot; class=&quot;headerlink&quot; title=&quot;创建自定义网页&quot;&gt;&lt;/a&gt;创建自定义网页&lt;/h4&gt;&lt;p&gt;网页可以是自己编写的，也可以是别人现成的源码（下载喜欢的页面）。&lt;/p&gt;
&lt;p&gt;网页编写完成后，在Hexo\source目录下创建一个文件夹（文件夹名称任意，比如我创建的是about这个文件夹，部署完成后，访问&lt;a href=&quot;http://mrlsm.github.io/about即可看到效果，依此类推）&quot;&gt;http://mrlsm.github.io/about即可看到效果，依此类推）&lt;/a&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="hexo" scheme="http://mrlsm.github.io/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>python之旅-基础知识</title>
    <link href="http://mrlsm.github.io/2018/07/18/python%E4%B9%8B%E6%97%85-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
    <id>http://mrlsm.github.io/2018/07/18/python之旅-基础知识/</id>
    <published>2018-07-18T02:00:00.000Z</published>
    <updated>2018-07-23T08:52:29.779Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>最近开始学习python这门语言，开始接触的时候还是看知乎有人用python做爬虫工作，看起来非常有兴趣。故开始学习python的路程。</p><p>都说学习一门语言最最基础的是掌握语言基础，其实我觉得不然，最基础的应该是把环境整理完善并搭建成功（快捷的编辑器会比命令行程序更能使你学习编写一门语言）。</p><h2 id="搭建环境"><a href="#搭建环境" class="headerlink" title="搭建环境"></a>搭建环境</h2><p>python27和python36选择一款即可。编辑器我用的是PyCharm。<br>python官方下载地址：<a href="https://www.python.org/downloads/" target="_blank" rel="noopener">https://www.python.org/downloads/</a><br>PyCharm官方下载地址：<a href="https://www.jetbrains.com/pycharm/download/" target="_blank" rel="noopener">https://www.jetbrains.com/pycharm/download/</a></p><p>安装以及环境的配置跟大部分软件一样（如有困难百度即可）<br><a id="more"></a></p><h2 id="基础语法"><a href="#基础语法" class="headerlink" title="基础语法"></a>基础语法</h2><p>好了，终于可以开始我们python之旅了。</p><h3 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h3><ul><li>Python中的代码块以缩进来表示每一个单一的语法块，逆缩进则表示一个代码块的结束。</li><li>方法声明以“：”字符结束，并且开启一个缩进来表示方法内容。</li><li>注释以“#”字符开头。</li><li>运算符号可适用于多种数据类型。<h3 id="基本数据结构"><a href="#基本数据结构" class="headerlink" title="基本数据结构"></a>基本数据结构</h3></li><li>列表（list）：类似于数组，但可存放多种数据形式的子元素</li><li>元组（tuple）：不可变的数组类型</li><li>字典（dictionaries）：哈希表，一组具有关联联系的数组类型</li></ul><h3 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h3><ul><li>通过“def”关键字进行声明，def语句将创建一个函数对象并将其赋值给一个变量名。</li><li>可以直接使用return进行返回各种数据类型。可以出现在函数体的任何位置，它表示函数调用的结束，并将结果返回至函数调用处。</li><li>匿名函数(lambda):这个表达式创建了一个之后能够调用的函数，但是它返回了一个函数而不是将这个函数赋值给一个变量名。常常以一个行内函数定义的形式使用，或者用作推迟执行一些代码。(和C语言中的宏定义有些相像)。</li><li>在序列中映射函数(map):map函数会对一个序列对象中的每个元素应用被传入的函数，并且返回一个包含了所有函数调用结果的一个列表。</li></ul><ol start="5"><li>函数式编程工具(filter和reduce):filter用于过滤出一些元素，reduce对每对元素都应用函数并运行到最后的结果。<h3 id="类"><a href="#类" class="headerlink" title="类"></a>类</h3>支持多重继承。<h3 id="文件操作I-O"><a href="#文件操作I-O" class="headerlink" title="文件操作I/O"></a>文件操作I/O</h3>这主要运用python os API进行操作<br>详情可见：<a href="http://www.cnblogs.com/xinchrome/p/5011304.html" target="_blank" rel="noopener">http://www.cnblogs.com/xinchrome/p/5011304.html</a><h3 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h3></li></ol><ul><li>列表(数组)元素可删除：del方法</li><li>数值判断时可以连用：if(1&lt;x&lt;3):</li><li>常用API方法的使用：<ul><li>排序：list sort</li><li>文件目录遍历： os.walk(file)</li><li>列表去重： list uniq</li><li>字典排序： dict sort</li><li>调用系统方法 os.system()</li></ul></li><li>字符串的三引号运用可保证其内容格式不变，例如需要一块SQL、HTML则不必要进行特殊字符串的转义。</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;最近开始学习python这门语言，开始接触的时候还是看知乎有人用python做爬虫工作，看起来非常有兴趣。故开始学习python的路程。&lt;/p&gt;
&lt;p&gt;都说学习一门语言最最基础的是掌握语言基础，其实我觉得不然，最基础的应该是把环境整理完善并搭建成功（快捷的编辑器会比命令行程序更能使你学习编写一门语言）。&lt;/p&gt;
&lt;h2 id=&quot;搭建环境&quot;&gt;&lt;a href=&quot;#搭建环境&quot; class=&quot;headerlink&quot; title=&quot;搭建环境&quot;&gt;&lt;/a&gt;搭建环境&lt;/h2&gt;&lt;p&gt;python27和python36选择一款即可。编辑器我用的是PyCharm。&lt;br&gt;python官方下载地址：&lt;a href=&quot;https://www.python.org/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.python.org/downloads/&lt;/a&gt;&lt;br&gt;PyCharm官方下载地址：&lt;a href=&quot;https://www.jetbrains.com/pycharm/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.jetbrains.com/pycharm/download/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装以及环境的配置跟大部分软件一样（如有困难百度即可）&lt;br&gt;
    
    </summary>
    
    
      <category term="python" scheme="http://mrlsm.github.io/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>github+hexo 给你一个漂亮的主页</title>
    <link href="http://mrlsm.github.io/2018/07/17/github-hexo%E7%BB%99%E4%BD%A0%E4%B8%80%E4%B8%AA%E6%BC%82%E4%BA%AE%E7%9A%84%E4%B8%BB%E9%A1%B5/"/>
    <id>http://mrlsm.github.io/2018/07/17/github-hexo给你一个漂亮的主页/</id>
    <published>2018-07-17T10:00:00.000Z</published>
    <updated>2018-07-23T08:52:06.678Z</updated>
    
    <content type="html"><![CDATA[<p>假如你想自定义一个带有自己style的网站，那么跟我来一起学习一下吧！</p><p>我创建的这个博客是使用的github page + Hexo方法。</p><h4 id="现在开始搭建属于自己的blog了"><a href="#现在开始搭建属于自己的blog了" class="headerlink" title="现在开始搭建属于自己的blog了"></a>现在开始搭建属于自己的blog了</h4><ul><li>环境搭建（git、node.js）</li><li>安装和配置Hexo（选择模板）</li><li>配置github仓库</li><li>配置自己的网址（也叫域名）</li><li>创建和发布文章</li></ul><h4 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h4><ul><li>安装git （使用git给github上传文章）</li><li>安装Node.js（Hexo是基于Node.js开发的）<h5 id="安装git"><a href="#安装git" class="headerlink" title="安装git"></a>安装git</h5>git官网(<a href="http://git-scm.com" target="_blank" rel="noopener">http://git-scm.com</a>)<br>从官网进行下载，并安装使用。<h5 id="安装Node-js"><a href="#安装Node-js" class="headerlink" title="安装Node.js"></a>安装Node.js</h5>进入官网(<a href="https://nodejs.org/en/" target="_blank" rel="noopener">https://nodejs.org/en/</a>)<br>从官网进行下载，并安装使用。<a id="more"></a><h4 id="安装和配置Hexo"><a href="#安装和配置Hexo" class="headerlink" title="安装和配置Hexo"></a>安装和配置Hexo</h4>打开电脑command（命令提示符）<br>执行以下命令（可复制粘贴执行）</li></ul><pre><code>npm install -g hexo-clinpm install</code></pre><p>选择电脑中的一处地址建立你存放blog相关资料的位置。建立文件夹（hexo）</p><pre><code>cd hexo （进入该文件目录下）hexo init</code></pre><p>如果没什么问题就可以启动本地这个Hexo服务</p><pre><code>hexo server</code></pre><p>看见以下log则说明你已经完成hexo的安装了</p><pre><code>Hexo is running at http://localhost:4000/. Press Ctrl+C to stop.</code></pre><p>好的，现在显示的网站为最基本的主题，现在我们可以更改一下主题<br>按ctrl+c关闭server<br>我博客使用的主题是(<a href="https://github.com/litten/hexo-theme-yilia" target="_blank" rel="noopener">https://github.com/litten/hexo-theme-yilia</a>)</p><p>打开终端窗口，输入一下命令，将目录切换到Hexo文件夹内的themes文件夹内</p><pre><code>cd themes</code></pre><p>然后把这个主题从github网站上clone下来，保存为yilia文件</p><pre><code>git clone https://github.com/litten/hexo-theme-yilia.git</code></pre><p>也可以打开链接复制下来解压到你的themes目录下，保存为yilia文件</p><p>然后打开Hexo文件夹下面的_config.yml文件，修改里面的theme为yilia</p><p>重新打开server，浏览器输入<a href="http://0.0.0.0:4000/" target="_blank" rel="noopener">http://0.0.0.0:4000/</a> 主题就发生了变化</p><p>好了，到此为止我们已经完成了本地Hexo的安装和配置。</p><h4 id="配置github仓库"><a href="#配置github仓库" class="headerlink" title="配置github仓库"></a>配置github仓库</h4><p>github官网(<a href="http://www.github.com" target="_blank" rel="noopener">http://www.github.com</a>)</p><p>进入github网址，注册一个账号，然后创建一个的放博客文章的仓库<br>点击Crete a repositor<br><img src="https://i.imgur.com/QBV7fWw.png" alt=""><br>注：你博客的访问地址，也就是仓库名 用户名.github.io必须是这个结构，不能有一点偏差。就按照我的方式创建就行，只需要把用户名改为你的<br>然后点击创建，会初始化一个空的仓库。</p><h5 id="然后就是配置SSH"><a href="#然后就是配置SSH" class="headerlink" title="然后就是配置SSH"></a>然后就是配置SSH</h5><p>命令行方法：<br>执行下面命令生成SSH</p><p>ssh-keygen<br>敲三次回车，既可以生成id_rsa.pub文件。</p><p>这里面就是SSH key的内容<br>然后使用vim编辑器打开这个文件</p><pre><code>vim ~/.ssh/id_rsa.pub</code></pre><p>然后使用鼠标拷贝里面的内容（退出vim编辑器命令:wq）</p><p>打开你的github,点击Setting<br>点击左边SSH keys<br>点击右边Add SSH<br>然后把复制的内容粘贴到下面那个框里面，title随便自己写。<br>过程可能会让你输入一次密码，输入即可！<br>配置好就行了</p><p>判断SSH是否配置好</p><pre><code>ssh -T git@github.com</code></pre><p>出现Hi CoderTian! You’ve successfully authenticated, but GitHub does not provide shell access. 就表示你已经配置好了SSH</p><p>SSH配置好了，下面配置你的本地Hexo<br>打开Hexo目录下的_config.yml<br>完成下列更改</p><pre><code># Deployment## Docs: https://hexo.io/docs/deployment.htmldeploy:    type: git    repository: git@github.com:mrlsm/mrlsm.github.io.git    branch: master</code></pre><p>保存，cd到Hexo的根目录<br>依次执行下面的命令<br>第一次上传可能会让你输入git的用户名和密码</p><pre><code>hexo cleanhexo d -g</code></pre><p>到这里为止，你已经完成了自己博客的创建了</p><h4 id="配置自己的网站（域名）"><a href="#配置自己的网站（域名）" class="headerlink" title="配置自己的网站（域名）"></a>配置自己的网站（域名）</h4><p>现在你就可以去选择一个自己的域名了（在这我是去阿里云买的域名）</p><p>首先去万网(<a href="http://wanwang.aliyun.com" target="_blank" rel="noopener">http://wanwang.aliyun.com</a>) 购买自己的域名。如下图选择一个自己喜欢的并且未注册的域名，新买的域名需要身份认证，大约一两天即可完成认证（不妨碍你选择已经注册的域名，谁让你有钱呢）<br><img src="https://i.imgur.com/qAS3P53.png" alt=""></p><p>然后去github，点击进去你创建的那个博客仓库点击<em>create a new file here</em></p><p>名字为CNAME 内容为你自己申请的域名 例如：qq.com</p><p>把里面的<strong>CNAME</strong>文件拖到<strong>Hexo</strong>文件的<strong>Source</strong>目录下</p><p>这边配置好了以后，来到阿里云的域名管理器来解析你的域名，如下图所示：<br><img src="https://i.imgur.com/YYhZasI.png" alt=""><br>等待你的域名解析生效并通过身份认证吧。就可以在浏览器里面输入你自己的域名访问的博客了。</p><h4 id="创建和发布文章"><a href="#创建和发布文章" class="headerlink" title="创建和发布文章"></a>创建和发布文章</h4><p>想要发布新的文章，首先创建文章</p><p>cd到Hexo文件夹</p><pre><code>hexo new &quot;文章标题&quot;</code></pre><p>你可以在Hexo-&gt;Source-&gt;_post目录下看到你新创建的那个文章，还有一个配套的文件夹，里面放这边博文的图片资源</p><p>使用支持MarkDown编辑器编写的打开新创建的文件，就可以写文章了，要根据MarkDown语法写出来的文章才会好看</p><p>Mac的markdown编辑器，推荐mou (<a href="http://25.io/mou/" target="_blank" rel="noopener">http://25.io/mou/</a>)</p><p>window下面的编辑器，推荐MarkDownPad (<a href="http://markdownpad.com/" target="_blank" rel="noopener">http://markdownpad.com/</a>)</p><p>markdown具体语法参考(<a href="http://www.appinn.com/markdown/#code" target="_blank" rel="noopener">http://www.appinn.com/markdown/#code</a>)</p><p>文章写好直接执行下面命令即可直接发布文章</p><pre><code>hexo d -g</code></pre><p>如果发布时候出现错误</p><pre><code>ERROR Deployer not found: git</code></pre><p>执行</p><pre><code>npm install hexo-deployer-git --save</code></pre><p>关于一些hexo命令可以查看官方文档进行配置 (<a href="https://hexo.io/zh-cn/docs/" target="_blank" rel="noopener">https://hexo.io/zh-cn/docs/</a>)</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;假如你想自定义一个带有自己style的网站，那么跟我来一起学习一下吧！&lt;/p&gt;
&lt;p&gt;我创建的这个博客是使用的github page + Hexo方法。&lt;/p&gt;
&lt;h4 id=&quot;现在开始搭建属于自己的blog了&quot;&gt;&lt;a href=&quot;#现在开始搭建属于自己的blog了&quot; class=&quot;headerlink&quot; title=&quot;现在开始搭建属于自己的blog了&quot;&gt;&lt;/a&gt;现在开始搭建属于自己的blog了&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;环境搭建（git、node.js）&lt;/li&gt;
&lt;li&gt;安装和配置Hexo（选择模板）&lt;/li&gt;
&lt;li&gt;配置github仓库&lt;/li&gt;
&lt;li&gt;配置自己的网址（也叫域名）&lt;/li&gt;
&lt;li&gt;创建和发布文章&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;环境搭建&quot;&gt;&lt;a href=&quot;#环境搭建&quot; class=&quot;headerlink&quot; title=&quot;环境搭建&quot;&gt;&lt;/a&gt;环境搭建&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;安装git （使用git给github上传文章）&lt;/li&gt;
&lt;li&gt;安装Node.js（Hexo是基于Node.js开发的）&lt;h5 id=&quot;安装git&quot;&gt;&lt;a href=&quot;#安装git&quot; class=&quot;headerlink&quot; title=&quot;安装git&quot;&gt;&lt;/a&gt;安装git&lt;/h5&gt;git官网(&lt;a href=&quot;http://git-scm.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://git-scm.com&lt;/a&gt;)&lt;br&gt;从官网进行下载，并安装使用。&lt;h5 id=&quot;安装Node-js&quot;&gt;&lt;a href=&quot;#安装Node-js&quot; class=&quot;headerlink&quot; title=&quot;安装Node.js&quot;&gt;&lt;/a&gt;安装Node.js&lt;/h5&gt;进入官网(&lt;a href=&quot;https://nodejs.org/en/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nodejs.org/en/&lt;/a&gt;)&lt;br&gt;从官网进行下载，并安装使用。
    
    </summary>
    
    
      <category term="hexo" scheme="http://mrlsm.github.io/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>android常见问题整理</title>
    <link href="http://mrlsm.github.io/2017/12/01/android%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E6%95%B4%E7%90%86/"/>
    <id>http://mrlsm.github.io/2017/12/01/android常见问题整理/</id>
    <published>2017-12-01T04:12:12.000Z</published>
    <updated>2018-08-17T02:50:53.118Z</updated>
    
    <content type="html"><![CDATA[<h3 id="配置问题"><a href="#配置问题" class="headerlink" title="配置问题"></a>配置问题</h3><h4 id="出现AndroidStudio导入项目在-Building-gradle-project-info-一直卡住"><a href="#出现AndroidStudio导入项目在-Building-gradle-project-info-一直卡住" class="headerlink" title="出现AndroidStudio导入项目在 Building * gradle project info 一直卡住"></a>出现AndroidStudio导入项目在 Building * gradle project info 一直卡住</h4><p>这种情况多半是导入的项目使用的gradle与你当前使用的版本不一致，正在下载所致。</p><p>解决办法主要有三种：</p><ul><li>一、直接下载gradle离线包。<ul><li>查看所需gradle版本：打开C:\Users\用户名.gradle\wrapper\dists\gradle-x.xx-all\xxxxxxxxxxxx，如果里面的gradle-xx-all.zip不完整（如0KB），则说明下载不成功，需要下载离线包放置到该目录下。</li><li>gradle各个版本离线包下载地址：<a href="https://services.gradle.org/distributions/" target="_blank" rel="noopener">https://services.gradle.org/distributions/</a></li><li>导入完成后，运行AS之后会自动解压，重新打开项目即可。</li></ul></li><li>二、修改项目的gradle-wrapper.properties里的gradle版本为自己电脑已有的版本。</li><li>三、点击取消后，重新在build.gradle下配置你以前使用的gradle版本。<ul><li>二三同理 修改成当前使用过的gradle版本</li></ul></li></ul><a id="more"></a><p>离线包下载导入方式</p><p>查看所需gradle版本：打开C:\Users\用户名.gradle\wrapper\dists\gradle-x.xx-all\xxxxxxxxxxxx，如果里面的gradle-xx-all.zip不完整（如0KB），则说明下载不成功，需要下载离线包放置到该目录下</p><h4 id="出现-Gradle’s-dependency-cache-may-be-corrupt-错误"><a href="#出现-Gradle’s-dependency-cache-may-be-corrupt-错误" class="headerlink" title="出现 Gradle’s dependency cache may be corrupt 错误"></a>出现 Gradle’s dependency cache may be corrupt 错误</h4><p><img src="https://i.imgur.com/f6MWIXu.jpg" alt=""></p><p>在gradle文件下 gradle-wrapper.properties里修改了gradle的版本，与之前没有报错的gradle版本一致。就可以了</p><p><img src="https://i.imgur.com/QoOj3dg.png" alt=""></p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;配置问题&quot;&gt;&lt;a href=&quot;#配置问题&quot; class=&quot;headerlink&quot; title=&quot;配置问题&quot;&gt;&lt;/a&gt;配置问题&lt;/h3&gt;&lt;h4 id=&quot;出现AndroidStudio导入项目在-Building-gradle-project-info-一直卡住&quot;&gt;&lt;a href=&quot;#出现AndroidStudio导入项目在-Building-gradle-project-info-一直卡住&quot; class=&quot;headerlink&quot; title=&quot;出现AndroidStudio导入项目在 Building * gradle project info 一直卡住&quot;&gt;&lt;/a&gt;出现AndroidStudio导入项目在 Building * gradle project info 一直卡住&lt;/h4&gt;&lt;p&gt;这种情况多半是导入的项目使用的gradle与你当前使用的版本不一致，正在下载所致。&lt;/p&gt;
&lt;p&gt;解决办法主要有三种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一、直接下载gradle离线包。&lt;ul&gt;
&lt;li&gt;查看所需gradle版本：打开C:\Users\用户名.gradle\wrapper\dists\gradle-x.xx-all\xxxxxxxxxxxx，如果里面的gradle-xx-all.zip不完整（如0KB），则说明下载不成功，需要下载离线包放置到该目录下。&lt;/li&gt;
&lt;li&gt;gradle各个版本离线包下载地址：&lt;a href=&quot;https://services.gradle.org/distributions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://services.gradle.org/distributions/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;导入完成后，运行AS之后会自动解压，重新打开项目即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;二、修改项目的gradle-wrapper.properties里的gradle版本为自己电脑已有的版本。&lt;/li&gt;
&lt;li&gt;三、点击取消后，重新在build.gradle下配置你以前使用的gradle版本。&lt;ul&gt;
&lt;li&gt;二三同理 修改成当前使用过的gradle版本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
    
      <category term="Android" scheme="http://mrlsm.github.io/tags/Android/"/>
    
  </entry>
  
  <entry>
    <title>java&amp;android 面试题</title>
    <link href="http://mrlsm.github.io/2016/12/01/java-android-%E9%9D%A2%E8%AF%95%E9%A2%98/"/>
    <id>http://mrlsm.github.io/2016/12/01/java-android-面试题/</id>
    <published>2016-12-01T07:29:04.000Z</published>
    <updated>2018-07-23T08:52:20.020Z</updated>
    
    <content type="html"><![CDATA[<p>——-持续更新———–</p><h2 id="Java部分"><a href="#Java部分" class="headerlink" title="Java部分"></a>Java部分</h2><ol><li><strong>一、抽象类和接口的区别</strong><ul><li>一个类只能继承单个类，但是可以实现多个接口 接口强调特定功能的实现，而抽象类强调所属关系 抽象类中的所有方法并不一定要是抽象的，你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象的</li></ul></li><li><strong>二、Override和Overload的含义和区别</strong><ul><li>Overload(重载)，它可以表现类的多态性，可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同；或者说可以改变参数、类型、返回值但是函数名字依然不变。 Override(重写)，在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数，当子类在调用这一函数时自动调用子类的方法，而父类相当于被覆盖（重写）了。</li></ul></li><li><strong>三、解析XML的几种方式的原理与特点：DOM、SAX、PULL</strong><ul><li>DOM：消耗内存：先把xml文档都读到内存中，然后再用DOM API来访问树形结构，并获取数据。这个写起来很简单，但是很消耗内存。要是数据过大，手机不够牛逼，可能手机直接死机。</li><li>SAX：解析效率高，占用内存少，基于事件驱动的：更加简单地说就是对文档进行顺序扫描，当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数，由事件处理函数做相应动作，然后继续同样的扫描，直至文档结束。</li><li>PULL：与 SAX 类似，也是基于事件驱动，我们可以调用它的next（）方法，来获取下一个解析事件（就是开始文档，结束文档，开始标签，结束标签），当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值，也可调用它的nextText()获取本节点的值。<a id="more"></a></li></ul></li><li><strong>四、ArrayList、LinkedList、Vector的区别</strong><ul><li>ArrayList 和Vector底层是采用数组方式存储数据，Vector由于使用了synchronized方法（线程安全）所以性能上比ArrayList要差。</li><li>LinkedList使用双向链表实现存储，随机存取比较慢，但是插入速度快。</li><li>HashMap的底层源码实现：当我们往HashMap中put元素的时候，先根据key的hashCode重新计算hash值，根据hash值得到这个元素在数组中的位置（即下标），如果数组该位置上已经存放有其他元素了，那么在这个位置上的元素将以链表的形式存放，新加入的放在链头，最先加入的放在链尾。如果数组该位置上没有元素，就直接将该元素放到此数组中的该位置上。</li></ul></li><li><strong>五、HashMap和 HashTable的区别</strong><ul><li>HashTable 则是基于 Map接口实现的 HashTable 是线程安全的， HashMap 则是线程不安全的 HashMap可以让你将空值作为一个表的条目的key或value。</li></ul></li><li><strong>六、对象的创建有几种方式有（4种显式地创建对象的方式）：</strong><ul><li>用new语句创建对象，这是最常用的创建对象的方式。</li><li>运用反射手段，调用Java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。</li><li>调用对象的clone()方法。</li><li>运用反序列化手段，调用java.io.ObjectInputStream对象的readObject()方法.</li></ul></li></ol><hr><h2 id="Android部分"><a href="#Android部分" class="headerlink" title="Android部分"></a>Android部分</h2><ol><li><strong>一、Activity 生命周期</strong><ul><li>生命周期描述的是一个类 从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法。在这个过程中，会针对不同的生命阶段会调用不同的方法</li><li>Activity从创建到销毁有多种状态，从一种状态到另一种状态时会激发相应的回调方法，这些回调方法包括：oncreate ondestroy onstop onstart onresume onpause</li><li>其实这些方法都是两两对应的，onCreate创建与onDestroy销毁；onStart可见与onStop不可见；onResume可编辑（即焦点）与onPause；这6个方法是相对应的，那么就只剩下一个onRestart方法了，在Activity被onStop后，但是没有被onDestroy，在再次启动此Activity时就调用onRestart（而不再调用onCreate）方法；如果被onDestroy了，则是调用onCreate方法。</li></ul></li><li><strong>二、dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念</strong><ul><li>Dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,每个android程序系统都会给他分配一个单独的liunx uid(user id),每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.</li></ul></li><li><strong>三、请解释下在单线程模型中Message,Handler,Message Queue,Looper之间的关系。</strong><ul><li>拿主线程来说，主线程启动时会调用Looper.prepare()方法，会初始化一个Looper，放入Threadlocal中，接着调用Looper.loop()不断遍历Message Queue，</li><li>Handler的创建依赖与当前线程中的Looper，如果当前线程没有Looper则必须调用Looper.prepare()。Handler , sendMessage到MessageQueue，Looper不断从MessageQueue中取出消息，回调handleMessage方法。</li></ul></li><li><strong>四、启动一个程序，可以主界面点击图标进入，也可以从一个程序中跳转过去，二者有什么区别？</strong><ul><li>是因为启动程序（主界面也是一个app），发现了在这个程序中存在一个设置为的activity,所以这个launcher会把icon提出来，放在主界面上。当用户点击icon的时候，发出一个Intent：<ul><li>Intent intent = mActivity.getPackageManager().getLaunchIntentForPackage(packageName);</li><li>mActivity.startActivity(intent);</li></ul></li><li>跳过去可以跳到任意允许的页面，如一个程序可以下载，那么真正下载的页面可能不是首页（也有可能是首页），这时还是构造一个Intent，startActivity. </li><li>这个intent中的action可能有多种view,download都有可能。系统会根据第三方程序向系统注册的功能，为你的Intent选择可以打开的程序或者页面。所以唯一的一点。 </li><li>不同的是从icon的点击启动的intent的action是相对单一的，从程序中跳转或者启动可能样式更多一些。本质是相同的。</li></ul></li><li><strong>五、注册Service需要注意什么</strong><ul><li>Service还是运行在主线程当中的，所以如果需要执行一些复杂的逻辑操作，最好在服务的内部手动创建子线程进行处理，否则会出现UI线程被阻塞的问题</li></ul></li><li><strong>六、Service与Activity怎么实现通信</strong><ul><li>方法一： 添加一个继承Binder的内部类，并添加相应的逻辑方法 <ul><li>重写Service的onBind方法，返回我们刚刚定义的那个内部类实例 </li><li>Activity中创建一个ServiceConnection的匿名内部类，并且重写里面的onServiceConnected方法和onServiceDisconnected方法，这两个方法分别会在活动与服务成功绑定以及解除绑定的时候调用，在onServiceConnected方法中，我们可以得到一个刚才那个service的binder对象，通过对这个binder对象进行向下转型，得到我们那个自定义的Binder实例，有了这个实例，做可以调用这个实例里面的具体方法进行需要的操作了</li></ul></li><li>方法二： 通过BroadCast(广播)的形式 当我们的进度发生变化的时候我们发送一条广播，然后在Activity的注册广播接收器，接收到广播之后更新视图</li></ul></li><li><strong>七、ListView卡顿的原因与性能优化，越多越好</strong><ul><li>重用converView： 通过复用converview来减少不必要的view的创建，另外Infalte操作会把xml文件实例化成相应的View实例，属于IO操作，是耗时操作。</li><li>减少findViewById()操作： 将xml文件中的元素封装成viewholder静态类，通过converview的setTag和getTag方法将view与相应的holder对象绑定在一起，避免不必要的findviewbyid操作</li><li>避免在 getView 方法中做耗时的操作: 例如加载本地 Image 需要载入内存以及解析 Bitmap ，都是比较耗时的操作，如果用户快速滑动listview，会因为getview逻辑过于复杂耗时而造成滑动卡顿现象。用户滑动时候不要加载图片，待滑动完成再加载，可以使用这个第三方库glide</li><li>Item的布局层次结构尽量简单，避免布局太深或者不必要的重绘</li><li>尽量能保证 Adapter 的 hasStableIds() 返回 true 这样在 notifyDataSetChanged() 的时候，如果item内容并没有变化，ListView 将不会重新绘制这个 View，达到优化的目的</li><li>在一些场景中，ScollView内会包含多个ListView，可以把listview的高度写死固定下来。 由于ScollView在快速滑动过程中需要大量计算每一个listview的高度，阻塞了UI线程导致卡顿现象出现，如果我们每一个item的高度都是均匀的，可以通过计算把listview的高度确定下来，避免卡顿现象出现</li><li>使用 RecycleView 代替listview： 每个item内容的变动，listview都需要去调用notifyDataSetChanged来更新全部的item，太浪费性能了。RecycleView可以实现当个item的局部刷新，并且引入了增加和删除的动态效果，在性能上和定制上都有很大的改善</li><li>ListView 中元素避免半透明： 半透明绘制需要大量乘法计算，在滑动时不停重绘会造成大量的计算，在比较差的机子上会比较卡。 在设计上能不半透明就不不半透明。实在要弄就把在滑动的时候把半透明设置成不透明，滑动完再重新设置成半透明。</li><li>尽量开启硬件加速： 硬件加速提升巨大，避免使用一些不支持的函数导致含泪关闭某个地方的硬件加速。当然这一条不只是对 ListView。</li></ul></li><li><strong>八、内存泄漏有哪些场景以及解决方法</strong><ul><li>类的静态变量持有大数据对象 静态变量长期维持到大数据对象的引用，阻止垃圾回收。</li><li>非静态内部类存在静态实例 非静态内部类会维持一个到外部类实例的引用，如果非静态内部类的实例是静态的，就会间接长期维持着外部类的引用，阻止被回收掉。</li><li>资源对象未关闭 资源性对象比如（Cursor，File文件等）往往都用了一些缓冲，我们在不使用的时候，应该及时关闭它们， 以便它们的缓冲及时回收内存。它们的缓冲不仅存在于java虚拟机内，还存在于java虚拟机外。 如果我们仅仅是把它的引用设置为null,而不关闭它们，往往会造成内存泄露。 解决办法： 比如SQLiteCursor（在析构函数finalize（）,如果我们没有关闭它，它自己会调close()关闭）， 如果我们没有关闭它，系统在回收它时也会关闭它，但是这样的效率太低了。 因此对于资源性对象在不使用的时候，应该调用它的close()函数，将其关闭掉，然后才置为null. 在我们的程序退出时一定要确保我们的资源性对象已经关闭。 程序中经常会进行查询数据库的操作，但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小， 对内存的消耗不容易被发现，只有在常时间大量操作的情况下才会复现内存问题，这样就会给以后的测试和问题排查带来困难和风险，记得try catch后，在finally方法中关闭连接</li><li>Handler内存泄漏 Handler作为内部类存在于Activity中，但是Handler生命周期与Activity生命周期往往并不是相同的，比如当Handler对象有Message在排队，则无法释放，进而导致本该释放的Acitivity也没有办法进行回收。 解决办法：</li><li>一些不良代码习惯 有些代码并不造成内存泄露，但是他们的资源没有得到重用，频繁的申请内存和销毁内存，消耗CPU资源的同时，也引起内存抖动 解决方案 如果需要频繁的申请内存对象和和释放对象，可以考虑使用对象池来增加对象的复用。 例如ListView便是采用这种思想，通过复用converview来避免频繁的GC</li></ul></li><li><strong>九、如何避免 OOM 问题的出现</strong><ul><li>使用更加轻量的数据结构 例如，我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构。通常的HashMap的实现方式更加消耗内存，因为它需要一个额外的实例对象来记录Mapping操作。另外，SparseArray更加高效，在于他们避免了对key与value的自动装箱（autoboxing），并且避免了装箱后的解箱。</li><li>避免在Android里面使用Enum Android官方培训课程提到过“Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.”，具体原理请参考《Android性能优化典范（三）》，所以请避免在Android里面使用到枚举。</li><li>减小Bitmap对象的内存占用 Bitmap是一个极容易消耗内存的大胖子，减小创建出来的Bitmap的内存占用可谓是重中之重，，通常来说有以下2个措施： inSampleSize：缩放比例，在把图片载入内存之前，我们需要先计算出一个合适的缩放比例，避免不必要的大图载入。 decode format：解码格式，选择ARGB_6666/RBG_545/ARGB_4444/ALPHA_6，存在很大差异</li><li>Bitmap对象的复用 缩小Bitmap的同时，也需要提高BitMap对象的复用率，避免频繁创建BitMap对象，复用的方法有以下2个措施 LRUCache : “最近最少使用算法”在Android中有极其普遍的应用。ListView与GridView等显示大量图片的控件里，就是使用LRU的机制来缓存处理好的Bitmap，把近期最少使用的数据从缓存中移除，保留使用最频繁的数据， inBitMap高级特性:利用inBitmap的高级特性提高Android系统在Bitmap分配与释放执行效率。使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域，新解码的Bitmap会尝试去使用之前那张Bitmap在Heap中所占据的pixel data内存区域，而不是去问内存重新申请一块区域来存放Bitmap。利用这种特性，即使是上千张的图片，也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小</li><li>使用更小的图片 在涉及给到资源图片时，我们需要特别留意这张图片是否存在可以压缩的空间，是否可以使用更小的图片。尽量使用更小的图片不仅可以减少内存的使用，还能避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用，很有可能在初始化视图时会因为内存不足而发生InflationException，这个问题的根本原因其实是发生了OOM。</li><li>StringBuilder 在有些时候，代码中会需要使用到大量的字符串拼接的操作，这种时候有必要考虑使用StringBuilder来替代频繁的“+”。</li><li>避免在onDraw方法里面执行对象的创建 类似onDraw等频繁调用的方法，一定需要注意避免在这里做创建对象的操作，因为他会迅速增加内存的使用，而且很容易引起频繁的gc，甚至是内存抖动。</li></ul></li><li><strong>十、Android中的动画有哪些，区别是什么？</strong><ul><li>逐帧动画(Drawable Animation)： 加载一系列Drawable资源来创建动画，简单来说就是播放一系列的图片来实现动画效果，可以自定义每张图片的持续时间</li><li>补间动画(Tween Animation)： Tween可以对View对象实现一系列简单的动画效果，比如位移，缩放，旋转，透明度等等。但是它并不会改变View属性的值，只是改变了View的绘制的位置，比如，一个按钮在动画过后，不在原来的位置，但是触发点击事件的仍然是原来的坐标。</li><li>属性动画(Property Animation)： 动画的对象除了传统的View对象，还可以是Object对象，动画结束后，Object对象的属性值被实实在在的改变了</li></ul></li><li><strong>十一、数据持久化的四种方式有哪些？</strong><ul><li>文件存储： 通过java.io.FileInputStream和java.io.FileOutputStream这两个类来实现对文件的读写，java.io.File类则用来构造一个具体指向某个文件或者文件夹的对象。</li><li>SharedPreferences： SharedPreferences是一种轻量级的数据存储机制，他将一些简单的数据类型的数据，包括boolean类型，int类型，float类型，long类型以及String类型的数据，以键值对的形式存储在应用程序的私有Preferences目录（/data/data/&lt;包名&gt;/shared_prefs/）中，这种Preferences机制广泛应用于存储应用程序中的配置信息。</li><li>SQLite数据库： 当应用程序需要处理的数据量比较大时，为了更加合理地存储、管理、查询数据，我们往往使用关系数据库来存储数据。Android系统的很多用户数据，如联系人信息，通话记录，短信息等，都是存储在SQLite数据库当中的，所以利用操作SQLite数据库的API可以同样方便的访问和修改这些数据。</li><li>ContentProvider: 主要用于在不同的应用程序之间实现数据共享的功能，不同于sharepreference和文件存储中的两种全局可读写操作模式，内容提供其可以选择只对哪一部分数据进行共享，从而保证我们程序中的隐私数据不会有泄漏的风险</li></ul></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;——-持续更新———–&lt;/p&gt;
&lt;h2 id=&quot;Java部分&quot;&gt;&lt;a href=&quot;#Java部分&quot; class=&quot;headerlink&quot; title=&quot;Java部分&quot;&gt;&lt;/a&gt;Java部分&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一、抽象类和接口的区别&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;一个类只能继承单个类，但是可以实现多个接口 接口强调特定功能的实现，而抽象类强调所属关系 抽象类中的所有方法并不一定要是抽象的，你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二、Override和Overload的含义和区别&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Overload(重载)，它可以表现类的多态性，可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同；或者说可以改变参数、类型、返回值但是函数名字依然不变。 Override(重写)，在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数，当子类在调用这一函数时自动调用子类的方法，而父类相当于被覆盖（重写）了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;三、解析XML的几种方式的原理与特点：DOM、SAX、PULL&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;DOM：消耗内存：先把xml文档都读到内存中，然后再用DOM API来访问树形结构，并获取数据。这个写起来很简单，但是很消耗内存。要是数据过大，手机不够牛逼，可能手机直接死机。&lt;/li&gt;
&lt;li&gt;SAX：解析效率高，占用内存少，基于事件驱动的：更加简单地说就是对文档进行顺序扫描，当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数，由事件处理函数做相应动作，然后继续同样的扫描，直至文档结束。&lt;/li&gt;
&lt;li&gt;PULL：与 SAX 类似，也是基于事件驱动，我们可以调用它的next（）方法，来获取下一个解析事件（就是开始文档，结束文档，开始标签，结束标签），当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值，也可调用它的nextText()获取本节点的值。
    
    </summary>
    
    
      <category term="Android" scheme="http://mrlsm.github.io/tags/Android/"/>
    
  </entry>
  
  <entry>
    <title>Android项目之多功能新闻客户端</title>
    <link href="http://mrlsm.github.io/2016/10/15/Android%E9%A1%B9%E7%9B%AE%E4%B9%8B%E5%A4%9A%E5%8A%9F%E8%83%BD%E6%96%B0%E9%97%BB%E5%AE%A2%E6%88%B7%E7%AB%AF/"/>
    <id>http://mrlsm.github.io/2016/10/15/Android项目之多功能新闻客户端/</id>
    <published>2016-10-15T07:13:53.000Z</published>
    <updated>2018-07-23T08:51:48.305Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>github 地址：<a href="https://github.com/mrlsm/newsClientSide" target="_blank" rel="noopener">https://github.com/mrlsm/newsClientSide</a></p></blockquote><h3 id="主要功能"><a href="#主要功能" class="headerlink" title="主要功能"></a>主要功能</h3><ul><li>进入有良好的动画效果</li><li>初始进入有新手引导界面</li><li>可以浏览新闻，一键分享</li><li>侧边栏，底部标题栏，多页面切换</li><li>消息推送等</li></ul><h3 id="新手引导界面"><a href="#新手引导界面" class="headerlink" title="新手引导界面"></a>新手引导界面</h3><ul><li>介绍<ul><li>引导用户使用APP的大致应用介绍（只在第一次使用时显示）</li></ul></li><li>实现<ul><li>可滑动的界面VIewPager（填充介绍APP的图片）</li><li>“开始体验”的Button按键 <ul><li>最后一个页面显示开始体验的按钮。</li></ul></li><li>显示下方页面指示器的小圆点<ul><li>OnPageCHangelistener()来判断移动位置和距离。</li><li>计算两个圆点的距离</li><li>移动距离=第二个圆点left值 - 第一个圆点left值</li><li>measure-&gt;layout(确定位置)-&gt;draw(activity的onCreate方法执行结束之后才会走此流程)</li><li>mPointDis = llContainer.getChildAt(1).getLeft() - llContainer.getChildAt(0).getLeft();</li><li>监听layout方法结束的事件,位置确定好之后再获取圆点间距<a id="more"></a><h3 id="程序进入时闪屏页面"><a href="#程序进入时闪屏页面" class="headerlink" title="程序进入时闪屏页面"></a>程序进入时闪屏页面</h3></li></ul></li></ul></li><li>动画实现旋转RotateAnimation，缩放ScaleAnimation，渐变AlphaAnimation效果，添加动画集合AnimationSet set并启动startAnimation(set)。</li><li>并在onAnimationEnd中判断动画是否结束,跳转页面，如果是第一次进入, 跳新手引导，否则跳主页面。<h3 id="侧滑菜单"><a href="#侧滑菜单" class="headerlink" title="侧滑菜单"></a>侧滑菜单</h3>使用SlidingMenu API实现方法</li></ul><pre><code>SlidingMenu slidingMenu = getSlidingMenu(); slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//全屏触摸 slidingMenu.setBehindOffset(200);//屏幕预留200像素宽度</code></pre><p>侧滑菜单的内容</p><ul><li>使用Xutils访问服务器Tomcat（使用开源框架Xutils） <ul><li>可以自己创建Tomcat服务器，也可以找线上服务器url地址连接。</li></ul></li><li>使用json文件保存页面所需数据（使用Gson解析数据） <ul><li>分类信息封装，使用Gson解析时：逢{}创建对象，逢[]创建集合(ArrayList)，所有字段名称要和json返回字段高度一致（字段匹配）</li><li>缓存json文件（key = url，value = json内容，保存在本地）</li></ul></li><li>侧边栏使用json文件的数据表示相关信息</li><li>点击侧边栏listview后，收起侧边栏。使用slidingmenu.toggle()方法（调用可以使侧边栏状态改变）</li><li>侧边栏点击后，应该修改新闻的内容 <ul><li>菜单的详细页的展示（TextView）</li><li>多次对象的引用来提取主页面的FrameLayout的布局。</li></ul></li></ul><h3 id="主页面的大致构造"><a href="#主页面的大致构造" class="headerlink" title="主页面的大致构造"></a>主页面的大致构造</h3><ul><li>底部标签栏 <ul><li>底部为RadioGroup+RadioButton来制作几个点击可变色的btn。</li></ul></li><li>标签页面 <ul><li>ViewPager(与底部标签栏相结合，所以禁止左右滑动)。</li></ul></li><li>标题栏 <ul><li>几个页面设置类似的标题栏，可以提取为style，改变标题文字即可。</li></ul></li><li>底部标签栏和标签页面一一对应 <ul><li>设置btn的点击事件，改变ViewPager相应界面</li><li>ViewPager会默认自动加载下一页。（浪费性能，应该禁用，调用onPageSelected(int pos)方法在显示界面时在加载此界面的Data）。</li><li>首页和设置页要禁用侧边栏。</li></ul></li></ul><h3 id="新闻页签页面"><a href="#新闻页签页面" class="headerlink" title="新闻页签页面"></a>新闻页签页面</h3><ol><li>可滑动的ViewPager制作页签页面 <ul><li>初始化页签页面(通过Xutils读取json数据)</li><li>两个ViewPager嵌套了，使外层ViewPager不拦截滑动事件，重写父类的ViewPager的事件拦截方法onInterceptTouchEvent() return false//设置不拦截。</li></ul></li><li>页签页面上方设置文字指示器 <ul><li>使用开源框架ViewPager Indicator，并将ViewPager和指示器绑定在一起</li><li>重写PagerAdapter的getPageTitle来设置页签页面的标题</li><li>在清单文件中修改背景style和文字style</li><li>页签滑动禁用侧边栏：调用dispatchTouchEvent方法，请求所有父类都不要拦截事件</li><li>设置页签页面第一页对侧边栏的调用，其他页签页面禁用侧边栏</li></ul></li><li>页签页面设置点击按钮跳转下一页 <ul><li>添加ImageButton，设置点击事件，跳转下一页面</li></ul></li><li>头条新闻内容的展示 <ul><li>头条新闻的轮流展示 ViewPager（第三个ViewPager的嵌套）</li><li>httpUtils来请求json数据，Gson解析json数据传递给ViewPager展示</li><li>新闻图片的缓存（BitmapUtils）</li><li>请求新闻图片ViewPager不要被上一层的ViewPager类拦截，同理重写它的父类方法，但滑动到最后自动切换页签页面的下一页面，所以设置拦截第一个和最后一个新闻图片。</li><li>设置第一个和最后一个新闻图片的滑动事件。</li><li>更新头条新闻信息的标题。（解析json数据，设置为title标题）</li><li>设置头条新闻页面指示器（使用ViewPagerIndicator框架，重写指示器的style，并关联新闻图片信息，OnPageSelected(0)默认第一个被选中）</li></ul></li><li>列表新闻展示 <ul><li>bitmap图片的压缩和自动剪切centerCrop中心剪切</li><li>列表新闻的大体内容TextView和时间TextView</li></ul></li><li>实现上下滑动使新闻移动 <ul><li>设置头条新闻ViewPager为列表新闻的头部局addHeaderView()</li></ul></li><li>实现下拉刷新 <ul><li>下拉刷新的ListView</li><li>设置刷新的animation的动画效果，但结束时clearAnimation()，不然隐藏出现问题。并判断当前刷新状态，则不进入刷新，略过该方法。</li><li>设置回调方法来refresh数据，完成之后设置隐藏刷新的ListView。</li><li>添加刷新时间读取Date()类即可。</li></ul></li><li>底部上滑加载 <ul><li>设置自定义进度条，表示下拉刷新。</li><li>判断是否为最后一个item并是否加载中，并添加数据。</li></ul></li><li>设置标记已读与未读 <ul><li>设置字符串保存新闻id来标记已读。</li></ul></li></ol><h3 id="新闻详细页"><a href="#新闻详细页" class="headerlink" title="新闻详细页"></a>新闻详细页</h3><ul><li>新闻标题栏 <ul><li>设置标题、返回、分享等btn。</li></ul></li><li>WebView全部内容 <ul><li>WebView加载已知网页。</li><li>添加加载进度条。</li></ul></li><li>字体设置 <ul><li>设置弹窗ChoiceItems并设置多个字体选项，更改WebView的字体设置大小。<h3 id="一键分享（第三方分享平台ShareSDK）"><a href="#一键分享（第三方分享平台ShareSDK）" class="headerlink" title="一键分享（第三方分享平台ShareSDK）"></a>一键分享（第三方分享平台ShareSDK）</h3></li></ul></li><li>ShareSDK官网设置分享（AppKey,jar包，按照官方文档设置即可）</li><li>上线APP就需要各个分享网站的认定，需要审核（略过）<h3 id="新闻的组图模式"><a href="#新闻的组图模式" class="headerlink" title="新闻的组图模式"></a>新闻的组图模式</h3></li><li>ListView与GridView的相互替换 <ul><li>单个新闻图片（ImageView+TextView）<h3 id="消息推送"><a href="#消息推送" class="headerlink" title="消息推送"></a>消息推送</h3></li></ul></li><li>JPush极光推送 <ul><li>推送消息（客户端被动接收服务器数据, 都可以用上消息推送技术）</li></ul></li></ul><p><strong>整体的功能大概的实现了</strong></p><p><strong>总结一下项目大致、修复bug、适配以及其他相关问题</strong></p><h4 id="三级缓存"><a href="#三级缓存" class="headerlink" title="三级缓存"></a>三级缓存</h4><ul><li>优先从内存中加载图片，速度快，不浪费流量 <ul><li>HashMap存取（有内存泄漏可能）- 软引用 （2.3之后，垃圾回收更易回收软引用，弱引用）</li><li>LruCache (将最近最少使用的对象回收掉) 建议使用（自己控制内存大小，避免溢出）</li></ul></li><li>其次从本地(sdcard)加载图片, 速度快, 不浪费流量 <ul><li>创建文件保存数据（网络下载后，本地缓存）</li></ul></li><li>最后从网络下载图片, 速度慢, 浪费流量 <ul><li>AsyncTask网络缓存，通过url读取传递数据。</li><li>AsyncTask&lt; , , &gt;三个泛型： <ul><li>doInBackground（正在加载，子线程运行，可以直接异步请求）里面的参数类型。</li><li>onProgressUpdate（更新加载，主线程）里面的参数类型。</li><li>onPostExecute（加载完成，主线程）里面的参数也是doInBackground的返回类型。</li></ul></li></ul></li></ul><h4 id="屏幕适配"><a href="#屏幕适配" class="headerlink" title="屏幕适配"></a>屏幕适配</h4><blockquote><p>养成良好的开发习惯: 多用dp,sp,不用px; 多用线性布局和相对布局, 不用绝对布局; 代码中如果必须设置像素的话, 将dp转为px进行设置。</p></blockquote><ul><li>图片适配</li><li>布局适配</li><li>尺寸适配(常用) <ul><li>dp = px/设备密度 </li></ul></li><li>权重适配<ul><li>android:weightSum=”3</li></ul></li></ul><hr><p>项目详情具体可见 <a href="https://github.com/mrlsm/newsClientSide" target="_blank" rel="noopener">github</a></p><p>谢谢观看！</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;github 地址：&lt;a href=&quot;https://github.com/mrlsm/newsClientSide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/mrlsm/newsClientSide&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;主要功能&quot;&gt;&lt;a href=&quot;#主要功能&quot; class=&quot;headerlink&quot; title=&quot;主要功能&quot;&gt;&lt;/a&gt;主要功能&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;进入有良好的动画效果&lt;/li&gt;
&lt;li&gt;初始进入有新手引导界面&lt;/li&gt;
&lt;li&gt;可以浏览新闻，一键分享&lt;/li&gt;
&lt;li&gt;侧边栏，底部标题栏，多页面切换&lt;/li&gt;
&lt;li&gt;消息推送等&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;新手引导界面&quot;&gt;&lt;a href=&quot;#新手引导界面&quot; class=&quot;headerlink&quot; title=&quot;新手引导界面&quot;&gt;&lt;/a&gt;新手引导界面&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;介绍&lt;ul&gt;
&lt;li&gt;引导用户使用APP的大致应用介绍（只在第一次使用时显示）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;实现&lt;ul&gt;
&lt;li&gt;可滑动的界面VIewPager（填充介绍APP的图片）&lt;/li&gt;
&lt;li&gt;“开始体验”的Button按键 &lt;ul&gt;
&lt;li&gt;最后一个页面显示开始体验的按钮。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;显示下方页面指示器的小圆点&lt;ul&gt;
&lt;li&gt;OnPageCHangelistener()来判断移动位置和距离。&lt;/li&gt;
&lt;li&gt;计算两个圆点的距离&lt;/li&gt;
&lt;li&gt;移动距离=第二个圆点left值 - 第一个圆点left值&lt;/li&gt;
&lt;li&gt;measure-&amp;gt;layout(确定位置)-&amp;gt;draw(activity的onCreate方法执行结束之后才会走此流程)&lt;/li&gt;
&lt;li&gt;mPointDis = llContainer.getChildAt(1).getLeft() - llContainer.getChildAt(0).getLeft();&lt;/li&gt;
&lt;li&gt;监听layout方法结束的事件,位置确定好之后再获取圆点间距
    
    </summary>
    
    
      <category term="Android" scheme="http://mrlsm.github.io/tags/Android/"/>
    
  </entry>
  
</feed>
