当前位置: 首页 > news >正文

用ps做网站是用像素还是毫米信用网站建设意义

用ps做网站是用像素还是毫米,信用网站建设意义,什么网站有加工外发做的,网页设计的八种样式看到了一篇关于内存泄漏的文章后#xff0c;就想着分享给大家#xff0c;最后一起学习#xff0c;一起进步#xff1a; 如果一个无用对象#xff08;不需要再使用的对象#xff09;仍然被其他对象持有引用#xff0c;造成该对象无法被系统回收#xff0c;以致该对象在…看到了一篇关于内存泄漏的文章后就想着分享给大家最后一起学习一起进步 如果一个无用对象不需要再使用的对象仍然被其他对象持有引用造成该对象无法被系统回收以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费这种情况下就是内存泄漏。 在Android开发中一些不好的编程习惯会导致我们开发的app存在内存泄漏的情况下面介绍一些在Android开发中常见的内存泄漏场景及优化方案。 单例导致内存泄漏 单例模式在Android开发中会经常用到但是如果使用不当就会导致内存泄漏。因为单例的静态特性使得它的生命周期同应用的生命周期一样长如果一个对象已经没有用处了但是单例还持有它的引用那么在整个应用程序的生命周期它都不能正常被回收从而导致内存泄漏。 public class AppSettings {private static AppSettings sInstance;private Context mContext;private AppSettings(Context context) {this.mContext context;}public static AppSettings getInstance(Context context) {if (sInstance null) {sInstance new AppSettings(context);}return sInstance;} }向上面代码中这样的单例如果我们再调用getInstance(Context context)方法的时候传入的context参数是ActivityService等上下文就会导致内存泄漏。 以Activity为例当我们启动一个Activity并调用getInstance(Context context)方法去获取AppSettings的单例传入Activity.this作为context这样AppSettings类的单例sInstance就持有了Activity的引用当我们退出Activity时该Activity就没有了但是因为sInstance作为静态单例在应用程序的整个生命周期中存在会继续持有这个Activity的引用导致这个Activity对象无法被回收释放这就造成了内存泄漏。 为了避免这样单例导致内存泄漏我们可以将context参数改为全局的上下文。 private AppSettings(Context context) {this.mContext context.getApplicationContext(); }全局的上下文Application Context就是应用程序的上下文和单例的生命周期一样长这样就避免了内存泄漏。 单例模式对应 应用程序的生命周期所以我们再构造单例的时候尽量避免使用Activity的上下文而是使用Appliction的上下文。 静态变量导致内存泄漏 静态变量存储在方法区它的生命周期从类加载开始到整个进程结束。一旦静态变量初始化后它所持有的引用只有等到进程结束才会释放。 比如下面这样的情况在Activity中为了避免重复的创建info将info作为静态变量 public class MainActivity extends AppCompatActivity { private static Info sInfo;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (sInfo ! null) {sInfo new Info(this);}} }class Info {public Info(Activity activity) {} }Info作为Activity的静态成员并且持有Activity的引用但是sInfor作为静态变量生命周期肯定比Activity长。所以当Activity退出后sInfor仍然引用了ActivityActivity不能被回收这就导致了内存泄漏。 在Android开发中静态持有很多时候都有可能因为其使用的生命周期不一致而导致内存泄漏所以我们再新建静态持有的变量的时候需要多考虑一下各个成员之间的引用关系并且尽量少地使用静态持有的变量以避免发生内存泄漏。当然我们也可以在适当的时候将静态变量重置为null使其不再持用引用这样也可以避免内存泄漏。 非静态内部内导致内存泄漏 非静态内部类包括匿名内部类默认就会持有外部类的引用当非静态内部类对象的生命周期比外部类对象的生命周期长时就会导致内存泄漏。 非静态内部类导致的内存泄漏在Android开发中有一种典型的场景就是使用Handler很多开发者在使用Handler是这样写的 public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);start();}private void start() {Message msg Message.obtain();msg.what 1;mHandler.sendMessage(msg);}private Handler mHandler new Handler() {Overridepublic void handleMessage(Message msg) {if (msg.what 1) {// 做相应逻辑}}}; }也许有人会说mHandler并未作为静态变量持有Activity引用生命周期可能不会比Activity长应该不一定会导致内存泄漏呢显然不是这样的 熟悉Handler消息机制的都知道mHandler会作为成员变量保存在发送的消息msg中即msg持有mHandler的引用而mHandler是Activity的非静态内部类实例即mHandler持有Activity的引用那么我们就可以理解为msg间接持有Activity的引用。msg被发送后先放到消息队列MessageQueue中然后等待Looper的轮询处理MessageQueue和Looper都是与线程相关联的MessageQueue是Looper引用的成员变量而Looper是保存在ThreadLocal中的。那么当Activity退出后msg可能仍然存在于消息队列MessageQueue中未处理或者正在处理那么这样就会导致Activity无法被回收以致发生Activity的内存泄漏。 给大家看一下源码如果想学习Handler消息机制可以看看这个博客https://blog.csdn.net/sjw890821sjw/article/details/142138517写的很好 通常在Android开发中如果要使用内部类但又要规避内存泄漏一般都会采用静态内部类弱引用的方式。 public class MainActivity extends AppCompatActivity {private Handler mHandler;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mHandler new MyHandler(this);start();}private void start() {Message msg Message.obtain();msg.what 1;mHandler.sendMessage(msg);}private static class MyHandler extends Handler {private WeakReferenceMainActivity activityWeakReference;public MyHandler(MainActivity activity) {activityWeakReference new WeakReference(activity);}Overridepublic void handleMessage(Message msg) {MainActivity activity activityWeakReference.get();if (activity ! null) {if (msg.what 1) {// 做相应逻辑}}}} }mHandler通过弱引用的方式持有Activity当GC执行垃圾回收时遇到Activity就会回收并释放所占据的内存单元。这样就不会发生内存泄漏了。 上面的做法确实避免了Activity导致的内存泄漏发送的msg不再已经没有持有Activity的引用了但是msg还是有可能存在消息队列MessageQueue中所以更好的是在Activity销毁时就将mHandler的回调和发送的消息给移除掉。 Overrideprotected void onDestroy() {super.onDestroy();mHandler.removeCallbacksAndMessages(null); }非静态内部类造成内存泄漏还有一种情况就是使用Thread或者AsyncTask。 比如在Activity中直接new一个子线程Thread public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {Overridepublic void run() {// 模拟相应耗时逻辑try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}).start();} }或者直接新建AsynTask异步任务 public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new AsyncTaskVoid, Void, Void() {Overrideprotected Void doInBackground(Void... params) {// 模拟相应耗时逻辑try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return null;}}.execute();} }很多初学者都会像上面这样新建线程和异步任务殊不知这样的写法非常地不友好这种方式新建的子线程Thread和AsynTask都是匿名内部类对象默认就隐式的持有外部Activity的引用导致Activity内存泄漏。要避免内存泄漏的话还是需要像上面Handler一样使用静态内部类弱引用的方式。 未取消注册或回调导致内存泄漏 比如我们在Activity中注册广播如果在Activity销毁后不再取消注册那么这个广播会一直存在系统中同上面所说的非静态内部类一样持有Activity引用导致内存泄漏。因此注册广播后在Activity销毁后一定要取消注册。 public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.registerReceiver(mReceiver, new IntentFilter());}private BroadcastReceiver mReceiver new BroadcastReceiver() {Overridepublic void onReceive(Context context, Intent intent) {// 接收到广播需要做的逻辑}};Overrideprotected void onDestroy() {super.onDestroy();this.unregisterReceiver(mReceiver);} }在注册观察者模式的时候如果不及时取消也会造成内存泄漏比如使用RetrofitRxJava注册网络请求的观察者回调同样作为匿名内部类持有外部引用所以需要记得在不用或者销毁的时候取消注册。 Timer和TimerTask导致内存泄漏 Timer和TimerTask在Android中通常会被用来做一些计时器或者循环任务比如实现无限轮播的ViewPager public class MainActivity extends AppCompatActivity {private ViewPager mViewPager;private PagerAdapter mAdapter;private Timer mTimer;private TimerTask mTimerTask;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();mTimer.schedule(mTimerTask, 3000, 3000);}private void init() {mViewPager (ViewPager) findViewById(R.id.view_pager);mAdapter new ViewPagerAdapter();mViewPager.setAdapter(mAdapter);mTimer new Timer();mTimerTask new TimerTask() {Overridepublic void run() {MainActivity.this.runOnUiThread(new Runnable() {Overridepublic void run() {loopViewpager();}});}};}private void loopViewpager() {if (mAdapter.getCount() 0) {int curPos mViewPager.getCurrentItem();curPos (curPos) % mAdapter.getCount();mViewPager.setCurrentItem(curPos);}}private void stopLoopViewPager() {if (mTimer ! null) {mTimer.cancel();mTimer.purge();mTimer null;}if (mTimerTask ! null) {mTimerTask.cancel();mTimerTask null;}}Overrideprotected void onDestroy() {super.onDestroy();stopLoopViewPager();} }当我们Activity销毁的时候有可能Timer还在继续等待执行TimerTask它持有Activity的引用不能被回收因此当我们Activity销毁的时候要立即cancel掉Timer和TimerTask,以避免发生内存泄漏。 集合中的对象未清理造成内存泄漏 这个比较好理解如果一个对象放入到ArrayListHashMap等集合中这个集合就会持有该对象的引用。当我们不在需要这个对象时也没有将它从集合中移除这样只要集合还在使用而此对象已经无用了这个对象就造成了内存泄漏。并且如果集合被静态引用的话集合里面那些没有用的对象更会造成内存泄漏了所以在使用集合时要将不用的对象从集合remove或者clear集合以避免内存泄漏。 资源未关闭或释放导致内存泄漏 在使用IOFile流或者Sqlite,Cursor等资源时要及时关闭这些资源在进行读写操作时通常都会使用了缓冲如果及时不关闭这些缓冲对象就会一直被占用而得不到释放以致发生内存泄漏。因此我们再不需要使用它们的时候就及时关闭以便缓冲能及时得到释放从而避免内存泄漏。 属性动画造成内存泄漏 动画同样是一个耗时任务比如在Activity中启动了属性动画ObjectAnimator,但是在销毁的时候没有调用Cancel方法虽然我们看不到动画了但是这个动画依然会不断地播放下去动画引用所在的控件所在控件引用Activity这就造成了Activity无法正常释放。因此同样要在Activity销毁的时候Cancel掉属性动画避免发生内存泄漏。 Override protected void onDestroy() {super.onDestroy();mAnimator.cancel(); }WebView造成内存泄漏 关于WebView的内存泄漏因为WebView在加载网页后会长期占用内存而不能被释放因此我们在Activity销毁后要调用它的destory()方法来销毁它以释放内存。 另外再查阅webView内存泄漏相关资料时看到这种情况 WebView下面的Callback持有Activity引用造成WebView内存无法释放即使是调用了WebView.destory()等方法都无法解决问题Android5.1之后 最终的解决方案是在销毁WebView之前需要先将WebView从父容器中移除然后在销毁WebView。详细分析过程请参考这篇文章https://blog.csdn.net/xygy8860/article/details/53334476?utm_sourceitdadaoutm_mediumreferral)(http://blog.csdn.net/xygy8860/article/details/53334476)[WebView Override protected void onDestroy() {super.onDestroy();// 先从父控件中移除 WebViewmWebViewContainer.removeView(mWebView);mWebView.stopLoading();mWebView.getSettings().setJavaScriptEnabled(false);mWebView.clearHistory();mWebView.removeAllViews();mWebView.destroy(); }总结 内存泄漏在Android内存优化是一个比较重要的一个方面很多时候程序中发生了内存泄漏我们不一定就能注意到所有在编码的过程要养成良好的习惯。总结下来只要做到以下这几点就能避免大多数情况下的内存泄漏 构造单例的时候尽量别用Activity的引用 静态引用时注意应用对象的置空或者少用静态引用 使用静态内部类软引用代替非静态内部类 及时取消广播或者观察者注册 耗时任务属性动画在Activity销毁时记得Cancel 文件流Cursor等资源及时关闭 Activity销毁时WebView的移除和销毁。
http://www.w-s-a.com/news/368081/

相关文章:

  • 玖云建站系统wordpress nodejs版本
  • 网站开发费用计入什么二级科目重庆企业网站推广
  • wordpress 菜单怎么使用方法宜春网站推广优化
  • dede 网站图标怎么自学建筑设计
  • 河北斯皮尔网站建设做微信小程序和做网站
  • 沈阳市住房和城乡建设局网站创意上海专业网站建设
  • 免费学编程国内网站it需要什么学历
  • 相城做网站的公司网站建设范本
  • 怎么样查中企动力做的网站阿里邮箱企业版手机版
  • 电子商务网站建设与管理试卷6江门网站建设联系电话
  • 公司的网站建设做什么费用四川圣泽建设集团有限公司网站
  • 为什么网站很少做全屏福利WordPress网站自动采集源码
  • 网站备案法律diy
  • 淘宝客如何新建网站物业管理系统app
  • 品牌网站建设策重大军事新闻视频
  • 廊坊建设网站的公司wordpress清理无用缩略图
  • 桓台网站建设公司首钢建设二建设公司网站
  • 网站建设添加背景命令前端如何优化网站性能
  • 设置网站域名中山画册设计公司
  • 三更app下载网站东莞网站制作公
  • 做图书馆网站模板网站建设文化策划方案
  • 惠州城乡住房建设厅网站服装设计自学零基础
  • 网站建设常态化工作机制广州骏域网络
  • h5婚纱摄影网站模板wordpress 显示下列项目
  • 广告网站推广销售北京最新消息发布
  • 完整网站源码asp拨打12355可以找团员密码吗
  • 北京有多少家网站怎么自己在百度上做网站
  • 怎样围绕网站专题发展来做ppt网站建设回龙观
  • 网站配置服务Wordpress红色网站源码
  • 外贸网站建设内容包括软件开发公司流程