android中常见的内存溢出和解决办法
来源:互联网 发布:外文图书数据库 编辑:程序博客网 时间:2024/06/05 03:09
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
- 内存溢出是什么鬼
- Context的溢出
- 内部类的种种问题感觉这个比较多一些呢
- Cursor
- adapter 现在都用recycleview了感觉写这个有点儿鸡肋
- Bitmap
android中的内存溢出估计大多数人在写代码的时候都出现过,其实突然觉得工作一年和工作三年的区别是什么呢,其实干的工作也许都一样,产品汪看到的结果也都一样,那区别就是速度和质量了。
写在前面的一点儿想法:工作做完了其实不会的还有很多,每天都有莫名的危机感,从真正写代码的这一年多总觉得自己的学习速度比别人的慢很多
内存溢出是什么鬼?
当某些对象不再被程序所使用,但是这些对象仍然被某些对象所引用着,进而导致垃圾收集器不能及时释放它们。
(无效的对象没有及时回收,导致内存不够用,致使程序
出错)
来个图片了解一下知道为什么导致内存泄露那就很好办了,都是跟对象有关系(就是new出来的 不要想着他会跟你结婚)
主要有以下几方面吧:平时注意一下 完全可以杜绝的
- Context
- 内部类(handler等)
- Cursor
- Adapter
- Bitmap
Context的溢出
来个图让大家分分钟理解一下:
看到这个图在稍加思索会不会觉得我们的工具类 貌似好多都持有了activity,而且工具类还是static类型。
在细琢磨一下呢。是不是activity的上下文都可以被application替代呢?
经验之谈:dialog ,fragment,inflate和启动activity 的上下文都是activity的,其他的都都可以被application替代。比如数据库的 服务的 广播的。都不要再用activity了吧。当然也要酌情处理。
- 举个栗子(太多了根本举不过来)
1.获取系统的服务
<code class="hljs avrasm has-numbering">getSystemService(Context<span class="hljs-preprocessor">.SENSOR</span>_SERVICE)<span class="hljs-comment">;</span> 改为 getApplicationContext()<span class="hljs-preprocessor">.getSystemService</span>(Context<span class="hljs-preprocessor">.SENSOR</span>_SERVICE)<span class="hljs-comment">;</span></code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
2.弄个数据库
<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NoteSQLiteOpenHelper</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">SQLiteOpenHelper</span> {</span> <span class="hljs-javadoc">/** *<span class="hljs-javadoctag"> @param</span> context 上下文 ; *<span class="hljs-javadoctag"> @param</span> name 数据库的名称 *<span class="hljs-javadoctag"> @param</span> cursorfactory 游标工厂null为默认的,是从第一条开始查询 *<span class="hljs-javadoctag"> @param</span> version 数据库的版本号从1开始。 */</span> <span class="hljs-keyword">public</span> <span class="hljs-title">NoteSQLiteOpenHelper</span>(<span class="hljs-title">getApplicationContext</span>()) { <span class="hljs-keyword">super</span>(getApplicationContext(), <span class="hljs-string">"note123.db"</span>, <span class="hljs-keyword">null</span>, <span class="hljs-number">1</span>); }}其实这里用activity的也无所谓但是会出现用着用着就把他弄成静态的了,那就悲剧了。</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
其他的就是 千万不要在 static的工具类里面 添加activity上下文
内部类的种种问题(感觉这个比较多一些呢)
简单说一下呢:比如 activity 开线程 跳刀handler 弹出dialog。 activity在销毁了,thread持有activity,然后跳到了handler,handler的对象也存在着了对吧,然后弹出dialog。这个时候呢dialog也持有了activity,但是因为activity销毁了所以不弹了。但对象还是持有者了。
怎么解决 内部类的问题呢。就是在 依附于的那个类销毁的时候 自己也销毁。就类似于activity销毁了。什么thread,dialog,handler全关掉
- handler的情况
<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LeakActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span> <span class="hljs-javadoc">/** * 声明静态内部类不会持有外部类的隐式引用 */</span> <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyHandler</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Handler</span> {</span> <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> WeakReference<SampleActivity> mActivity; <span class="hljs-keyword">public</span> <span class="hljs-title">MyHandler</span>(SampleActivity activity) { mActivity = <span class="hljs-keyword">new</span> WeakReference<SampleActivity>(activity); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleMessage</span>(Message msg) { SampleActivity activity = mActivity.get(); <span class="hljs-keyword">if</span> (activity != <span class="hljs-keyword">null</span>) { <span class="hljs-comment">// ...</span> } } } <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> MyHandler mHandler = <span class="hljs-keyword">new</span> MyHandler(<span class="hljs-keyword">this</span>); <span class="hljs-javadoc">/** * 这里的Runnable也是 * 声明静态内部类不会持有外部类的隐式引用 */</span> <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Runnable sRunnable = <span class="hljs-keyword">new</span> Runnable() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() { <span class="hljs-comment">/* ... */</span> } }; <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) { <span class="hljs-keyword">super</span>.onCreate(savedInstanceState); <span class="hljs-comment">//10分钟之后发送消息 </span> mHandler.postDelayed(sRunnable, <span class="hljs-number">1000</span> * <span class="hljs-number">60</span> * <span class="hljs-number">10</span>); <span class="hljs-comment">// 退回到上一个Activity</span> finish(); }}<span class="hljs-annotation">@Override</span><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDestroy</span>() { <span class="hljs-comment">//简单粗暴</span> mHandler.removeMessages(message); mHandler.removeCallbacks(Runnable); mHandler.removeCallbacksAndMessages(<span class="hljs-keyword">null</span>);}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
切断联系就行啦。
- dialog
刚才说的按个 activity都销毁了。但是还要在handler中执行dialog,那么久做个判断吧
<code class="hljs java has-numbering">Handler handler = <span class="hljs-keyword">new</span> Handler() { <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleMessage</span>(Message msg) { <span class="hljs-keyword">super</span>.handleMessage(msg); <span class="hljs-keyword">switch</span> (msg.what) { <span class="hljs-keyword">case</span> <span class="hljs-number">1</span>: <span class="hljs-keyword">if</span> (!isFinishing()) { dialog.show(); } <span class="hljs-keyword">break</span>; <span class="hljs-keyword">default</span>: <span class="hljs-keyword">break</span>; } } };</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
- thread 和asynctask的情况
在写这个的时候我就在想我还有必要写么。我都已经太久远的没用这两个了。我都用的是线程池了。
下面贴一个自定义的线程池代码,读者直接拿走(可以用 线程池+handler 或者 线程池+eventbus,rxbus等等来更新ui),activity销毁的事后 直接让线程池关闭就行啦
<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> com.ihealth.utils;<span class="hljs-keyword">import</span> java.util.HashMap;<span class="hljs-keyword">import</span> java.util.Map;<span class="hljs-keyword">import</span> java.util.concurrent.Executors;<span class="hljs-keyword">import</span> java.util.concurrent.LinkedBlockingQueue;<span class="hljs-keyword">import</span> java.util.concurrent.ThreadPoolExecutor;<span class="hljs-keyword">import</span> java.util.concurrent.ThreadPoolExecutor.AbortPolicy;<span class="hljs-keyword">import</span> java.util.concurrent.TimeUnit;<span class="hljs-javadoc">/** *<span class="hljs-javadoctag"> @author</span> wanghao * * 说明:一个简易的线程池管理类,提供三个线程池 进本的 子线程操作都可以满足 * * 线程内部都是 挨个进行,只有创建多个线程池的才可能会并发进行。 */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadManager</span> {</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String DEFAULT_SINGLE_POOL_NAME = <span class="hljs-string">"DEFAULT_SINGLE_POOL_NAME"</span>; <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> ThreadPoolProxy mLongPool = <span class="hljs-keyword">null</span>; <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Object mLongLock = <span class="hljs-keyword">new</span> Object(); <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> ThreadPoolProxy mShortPool = <span class="hljs-keyword">null</span>; <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Object mShortLock = <span class="hljs-keyword">new</span> Object(); <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> ThreadPoolProxy mDownloadPool = <span class="hljs-keyword">null</span>; <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Object mDownloadLock = <span class="hljs-keyword">new</span> Object(); <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Map<String, ThreadPoolProxy> mMap = <span class="hljs-keyword">new</span> HashMap<String, ThreadPoolProxy>(); <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Object mSingleLock = <span class="hljs-keyword">new</span> Object(); <span class="hljs-javadoc">/** 获取下载线程 */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ThreadPoolProxy <span class="hljs-title">getDownloadPool</span>() { <span class="hljs-keyword">synchronized</span> (mDownloadLock) { <span class="hljs-keyword">if</span> (mDownloadPool == <span class="hljs-keyword">null</span>) { mDownloadPool = <span class="hljs-keyword">new</span> ThreadPoolProxy(<span class="hljs-number">3</span>, <span class="hljs-number">3</span>, <span class="hljs-number">5</span>L); } <span class="hljs-keyword">return</span> mDownloadPool; } } <span class="hljs-javadoc">/** 获取一个用于执行长耗时任务的线程池,避免和短耗时任务处在同一个队列而阻塞了重要的短耗时任务,通常用来联网操作 */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ThreadPoolProxy <span class="hljs-title">getLongPool</span>() { <span class="hljs-keyword">synchronized</span> (mLongLock) { <span class="hljs-keyword">if</span> (mLongPool == <span class="hljs-keyword">null</span>) { mLongPool = <span class="hljs-keyword">new</span> ThreadPoolProxy(<span class="hljs-number">5</span>, <span class="hljs-number">5</span>, <span class="hljs-number">5</span>L); } <span class="hljs-keyword">return</span> mLongPool; } } <span class="hljs-javadoc">/** 获取一个用于执行短耗时任务的线程池,避免因为和耗时长的任务处在同一个队列而长时间得不到执行,通常用来执行本地的IO/SQL */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ThreadPoolProxy <span class="hljs-title">getShortPool</span>() { <span class="hljs-keyword">synchronized</span> (mShortLock) { <span class="hljs-keyword">if</span> (mShortPool == <span class="hljs-keyword">null</span>) { mShortPool = <span class="hljs-keyword">new</span> ThreadPoolProxy(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, <span class="hljs-number">5</span>L); } <span class="hljs-keyword">return</span> mShortPool; } } <span class="hljs-javadoc">/** 获取一个单线程池,所有任务将会被按照加入的顺序执行,免除了同步开销的问题 */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ThreadPoolProxy <span class="hljs-title">getSinglePool</span>() { <span class="hljs-keyword">return</span> getSinglePool(DEFAULT_SINGLE_POOL_NAME); } <span class="hljs-javadoc">/** 获取一个单线程池,所有任务将会被按照加入的顺序执行,免除了同步开销的问题 */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ThreadPoolProxy <span class="hljs-title">getSinglePool</span>(String name) { <span class="hljs-keyword">synchronized</span> (mSingleLock) { ThreadPoolProxy singlePool = mMap.get(name); <span class="hljs-keyword">if</span> (singlePool == <span class="hljs-keyword">null</span>) { singlePool = <span class="hljs-keyword">new</span> ThreadPoolProxy(<span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">5</span>L); mMap.put(name, singlePool); } <span class="hljs-keyword">return</span> singlePool; } } <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadPoolProxy</span> {</span> <span class="hljs-keyword">private</span> ThreadPoolExecutor mPool; <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> mCorePoolSize; <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> mMaximumPoolSize; <span class="hljs-keyword">private</span> <span class="hljs-keyword">long</span> mKeepAliveTime; <span class="hljs-keyword">private</span> <span class="hljs-title">ThreadPoolProxy</span>(<span class="hljs-keyword">int</span> corePoolSize, <span class="hljs-keyword">int</span> maximumPoolSize, <span class="hljs-keyword">long</span> keepAliveTime) { mCorePoolSize = corePoolSize; mMaximumPoolSize = maximumPoolSize; mKeepAliveTime = keepAliveTime; } <span class="hljs-javadoc">/** 执行任务,当线程池处于关闭,将会重新创建新的线程池 */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">void</span> <span class="hljs-title">execute</span>(Runnable run) { <span class="hljs-keyword">if</span> (run == <span class="hljs-keyword">null</span>) { <span class="hljs-keyword">return</span>; } <span class="hljs-keyword">if</span> (mPool == <span class="hljs-keyword">null</span> || mPool.isShutdown()) { <span class="hljs-comment">//参数说明</span> <span class="hljs-comment">//当线程池中的线程小于mCorePoolSize,直接创建新的线程加入线程池执行任务</span> <span class="hljs-comment">//当线程池中的线程数目等于mCorePoolSize,将会把任务放入任务队列BlockingQueue中</span> <span class="hljs-comment">//当BlockingQueue中的任务放满了,将会创建新的线程去执行,</span> <span class="hljs-comment">//但是当总线程数大于mMaximumPoolSize时,将会抛出异常,交给RejectedExecutionHandler处理</span> <span class="hljs-comment">//mKeepAliveTime是线程执行完任务后,且队列中没有可以执行的任务,存活的时间,后面的参数是时间单位</span> <span class="hljs-comment">//ThreadFactory是每次创建新的线程工厂</span> mPool = <span class="hljs-keyword">new</span> ThreadPoolExecutor(mCorePoolSize, mMaximumPoolSize, mKeepAliveTime, TimeUnit.MILLISECONDS, <span class="hljs-keyword">new</span> LinkedBlockingQueue<Runnable>(), Executors.defaultThreadFactory(), <span class="hljs-keyword">new</span> AbortPolicy()); } mPool.execute(run); } <span class="hljs-javadoc">/** 取消线程池中某个还未执行的任务 */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">void</span> <span class="hljs-title">cancel</span>(Runnable run) { <span class="hljs-keyword">if</span> (mPool != <span class="hljs-keyword">null</span> && (!mPool.isShutdown() || mPool.isTerminating())) { mPool.getQueue().remove(run); } } <span class="hljs-javadoc">/** 取消线程池中某个还未执行的任务 */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">contains</span>(Runnable run) { <span class="hljs-keyword">if</span> (mPool != <span class="hljs-keyword">null</span> && (!mPool.isShutdown() || mPool.isTerminating())) { <span class="hljs-keyword">return</span> mPool.getQueue().contains(run); } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>; } } <span class="hljs-javadoc">/** 立刻关闭线程池,并且正在执行的任务也将会被中断 */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">stop</span>() { <span class="hljs-keyword">if</span> (mPool != <span class="hljs-keyword">null</span> && (!mPool.isShutdown() || mPool.isTerminating())) { mPool.shutdownNow(); } } <span class="hljs-javadoc">/** 平缓关闭单任务线程池,但是会确保所有已经加入的任务都将会被执行完毕才关闭 */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">void</span> <span class="hljs-title">shutdown</span>() { <span class="hljs-keyword">if</span> (mPool != <span class="hljs-keyword">null</span> && (!mPool.isShutdown() || mPool.isTerminating())) { mPool.shutdownNow(); } } }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
- 广播
… has leaked IntentReceiver … Are you missing a call to unregisterReceiver()?
这个错误我们现在公司的代码还有大把的了。这么解决,一个大神的方法
<code class="hljs cs has-numbering">简单粗暴<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">unregisterReceiverSafe</span>(BroadcastReceiver receiver) { <span class="hljs-keyword">try</span> { getContext().unregisterReceiver(receiver); } <span class="hljs-keyword">catch</span> (IllegalArgumentException e) { <span class="hljs-comment">// ignore</span> }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
接下来的几个感觉大家应该都不会出太大的问题吧
Cursor
<code class="hljs matlab has-numbering"><span class="hljs-keyword">try</span><span class="hljs-cell">{}</span><span class="hljs-keyword">catch</span>()<span class="hljs-cell">{}</span>finally<span class="hljs-cell">{cur.close();cur=null;}</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
adapter (现在都用recycleview了。感觉写这个有点儿鸡肋)
<code class="hljs cs has-numbering">会造成内存溢出代码:<span class="hljs-keyword">public</span> View <span class="hljs-title">getView</span> (<span class="hljs-keyword">int</span> position, View convertView, ViewGroup parent) { View view = <span class="hljs-keyword">new</span> View(); XXX XXX <span class="hljs-keyword">return</span> view;}修正后的代码:<span class="hljs-keyword">public</span> View <span class="hljs-title">getView</span> (<span class="hljs-keyword">int</span> position, View convertView, ViewGroup parent) { <span class="hljs-keyword">if</span> (convertView == <span class="hljs-keyword">null</span>) { convertView = <span class="hljs-keyword">new</span> View(); XXX XXX } <span class="hljs-keyword">else</span> { XXX XXX }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
Bitmap
不用的时候调用 recycle(),把他清理掉
也可以用lrucache等方法,这就不做详细介绍。
转载请注明:http://blog.csdn.net/wanghao200906/article/details/50426881
就这样吧,忙里偷闲写了个博客,总结一下,其实内存溢出的问题都是 不小心导致的,避免起来也比较容易。文章有点儿长 读完了 :辛苦了您內,初级文章大神勿喷
- android中常见的内存溢出和解决办法
- android中常见的内存溢出和解决办法
- android中常见的内存溢出和解决办法
- android中常见的内存溢出和解决办法
- Android中常见的内存溢出和解决办法
- Android中常见的内存溢出错误
- java中常见内存溢出解决办法
- Android开发中常见的内存泄漏情况和解决办法
- 内存溢出的常见原因及解决办法
- 内存溢出的解决办法 Android
- 内存溢出的解决办法 Android
- Android-内存溢出的解决办法
- 内存溢出的解决办法 Android
- Android-内存溢出的解决办法 .
- Android 内存溢出 解决办法
- Android常见的内存溢出OOM
- java中常见的内存溢出错误
- android中内存泄漏和内存溢出的区别
- 自定义View之_日历控件
- 欢迎使用CSDN-markdown编辑器
- 安装完Oracle数据库,给scott账户解锁方法
- **二手车事业部面试题
- MVC模式原理
- android中常见的内存溢出和解决办法
- hdoj-4548-美素数
- spring4.1.3+springmvc+mybatis3.2.1整合
- 开源资源
- 用dimens去实现 屏幕适配
- 简单实现引导提示页
- JAVA温习课堂8
- 第三周 项目1 顺序表的基本运算
- python数组写入txt