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

做app网站的软件叫什么名字seo 资料包怎么获得

做app网站的软件叫什么名字,seo 资料包怎么获得,电子商务网站开发项目设计报告,简单网站 快速建设一、非静态内部类造成的内存泄漏 造成原因:非静态内部类默认会持有外部类的引用,如果内部类的生命周期超过了外部类就会造成内存泄漏。 场景:当Activity销毁后,由于内部类中存在异步耗时任务还在执行,导致Activity实…

一、非静态内部类造成的内存泄漏

造成原因:非静态内部类默认会持有外部类的引用,如果内部类的生命周期超过了外部类就会造成内存泄漏。

场景:当Activity销毁后,由于内部类中存在异步耗时任务还在执行,导致Activity实例一直被内部类持有无法被回收,造成内存泄漏

例如:

//TestActivity
button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new Thread(new Runnable() {@Overridepublic void run() {try {//模拟耗时Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}).start();}});

此时点击返回键关闭当前Activity,页面正常回退,但匿名内部类中还有耗时任务执行,如果耗时任务执行完之后要刷新页面还会造成异常导致app闪退。

解决办法:不使用匿名内部类,并且使用static关键字修饰内部类(static修饰的内部类不持有外部类的引用,也自然不会造成上面的内存泄漏),如果内部类中需要使用外部类的资源,可以使用弱引用的方式持有外部类。

优化后的代码如下:

button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new Thread(new MyRunnable()).start();}});static class MyRunnable implements Runnable{@Overridepublic void run() {try {//模拟耗时Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}

二、静态成员变量造成的内存泄漏

造成原因:静态成员变量的生命周期 = 应用程序的生命周期,如果该静态成员应用的变量生命周期 < 改静态变量则会造成内存泄漏

场景:静态成员变量持有了一个耗费资源过多的实例(Activity,Fragment)

例如:

public class Person {private static Activity mActivity;Person(Activity activity){mActivity = activity;}
}

此时点击返回键关闭当前Activity,但Person类中的mActivity静态变量持有当前Activity的引用,导致改Activity对象本该被回收而没被回收,导致内存泄漏

解决办法:

  1. 尽量避免 Static 成员变量引用资源耗费过多的实例(如Context)
  2. 如果必须使用Context,可以使用Application的Context
  3. 使用弱引用代替强引用持有

三、单例模式造成的内存泄漏

造成原因:单例模式由于其具有静态特性,导致其生命周期 = 应用程序生命周期,如果单例中持有别的类的实例,就会造成内存泄漏

场景:单例模式中持有一个耗费资源过多的实例(Context)

例如:

public class SingleInstance{private static SingleInstance instance;private Context mContext;private SingleInstance(Context context) {this.mContext = context; // 传递的是Activity的context}public SingleInstance getInstance(Context context) {if (instance == null) {instance = new SingleInstance(context);}return instance;}
}

此时由于单例中持有传入的Activity实例,倒是该Activity关闭时,资源得不到回收,从而造成内存泄漏

解决办法:

使用Application的Context代替Activity的Contex

四、Handler造成的内存泄漏

造成原因:当使用非静态内部类(包含匿名内部类)创建Handler时,Handler会持有外部类的对象,如果Handler中还有消息没执行完,此时创建Handler的Activity关闭就会造成内存泄漏。通常由于子线程持有handler的引用(因为要发消息给handler来更新界面),handler又持有activity的引用,从而导致activity不能正常被回收,造成内存泄漏

场景:Activity中通过一个子线程异步请求网络数据,请求成功后更新当前页面。

例如:

//MainActivity.javaprivate Handler mHandler = new Handler(Looper.getMainLooper()){@Overridepublic void handleMessage(Message msg) {//更新页面}};//成功获取到网络数据更新页面private void handleData(String data){Message message = Message.obtain();message.obj = data;mHandler.sendMessage(message);
}

解决办法:

1、静态内部类+弱引用

static class MyHandler extends Handler {WeakReference<Activity > mReference;MyHandler(Activity activity) {mReference= new WeakReference<Activity>(activity);}@Overridepublic void handleMessage(Message msg) {final Activity activity = mReference.get();if (activity != null) {//更新页面}}
}

2、activity销毁时,及时清理消息

@Override
protected void onDestroy() {super.onDestroy();if (mHandler != null)  {mHandler.removeCallbacksAndMessages(null);}
}

五、多线程造成的内存泄漏

造成原因:上面一和四其实也是多线程造成内存泄漏的场景,主要是子线程中持有外部类(例如Activity)的引用,让后子线程的生命周期又和Activity不同步,从而造成activity被销毁时子线程中的任务还在执行,从而导致activity的资源迟迟得不到回收造成内存泄漏。

六、集合类造成的内存泄漏

造成原因:当我们把一些对象的引用加入到集合对象(例如常用的ArrayList),当我们不需要改对象时,没有从集合中清理掉改对象的引用,这样集合就会越来越大,如果集合时static的那问题就更严重了。

场景:学生管理系统中需要统计学生信息,使用一个集合存储学生信息,信息统计完成,把信息存入数据库后就不需要学生对象信息了,但是没及时清理掉集合,导致学生对象得不到回收,造成内存泄漏

例如:

// 通过 循环申请Person 对象并放入集合
List<Person> personList = new ArrayList<>();for (int i = 0; i < 10; i++) {Person p = new Person();personList.add(p);
// 虽释放了集合元素引用的本身:p=null
// 但集合List仍然吃药后该对象引用,所以依然不可回收该对象p = null;
}

解决办法:在不使用改集合时,清理集合并把集合置为空

// 释放personList
personList.clear();
personList=null;

七、WebView造成的内存泄漏

造成原因:WebView中可能会进行大量的网络请求,加载大量的资源,从而使得内存占用过高,当我们推出承载Webview的Activity时,没有正确的释放WebView中的资源,导致内存泄漏。

例如:新闻列表页面使用WebView加载一个h5页面,此时会进行大量网络请求加载新闻图片内容,当我们回退该页面时,加载的资源没正确释放导致内存泄漏

解决方案:不使用xml定义webview,通过代码的形式,传入Application的Context然后在承载webview的页面销毁时,释放webview的资源

//代码初始化Webview
mWebView=new WebView(getApplicationContext());
LinearLayout linearLayout  = findViewById(R.id.webview);
linearLayout.addView(mWebView);@Override
protected void onDestroy() {if( mWebView!=null) {// 如果先调用destroy()方法,则会命中if (isDestroyed()) return;这一行代码,需要先onDetachedFromWindow(),再// destory()ViewParent parent = mWebView.getParent();if (parent != null) {((ViewGroup) parent).removeView(mWebView);}mWebView.stopLoading();// 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错mWebView.getSettings().setJavaScriptEnabled(false);mWebView.clearHistory();mWebView.clearView();mWebView.removeAllViews();mWebView.destroy();}super.on Destroy();
}

八、资源未释放造成的内存泄漏

造成原因:对于资源的使用(如 广播BraodcastReceiver、文件流File、数据库游标Cursor、图片资源Bitmap等),若在Activity销毁时无及时关闭 / 注销这些资源,则这些资源将不会被回收,从而造成内存泄漏

解决方案: 在Activity销毁时 及时关闭 / 注销资源

关闭资源代码如下:

// 对于 广播BraodcastReceiver:注销注册
unregisterReceiver()// 对于 文件流File:关闭流
InputStream / OutputStream.close()// 对于数据库游标cursor:使用后关闭游标
cursor.close()// 对于 图片资源Bitmap:Android分配给图片的内存只有8M,若1个Bitmap对象占内存较多,当它不再被使用时,应调用recycle()回收此对象的像素所占用的内存;最后再赋为null 
Bitmap.recycle()Bitmap = null;// 对于动画(属性动画)
// 将动画设置成无限循环播放repeatCount = “infinite”后
// 在Activity退出时记得停止动画

参考连接:WebView内存泄漏–解决方法小结 - 简书 (jianshu.com)

https://juejin.cn/post/6844904067534159880

http://www.wangmingla.cn/news/160431.html

相关文章:

  • 凡科怎样免费做网站seo技巧是什么意思
  • 网站 案例做个网站需要多少钱
  • 手把手教网站建设网络营销的好处和优势
  • 至少保存十个以上域名网站百度登录个人中心
  • 温州专业营销网站建设如何把网站推广
  • 网站制作百度资源宣传推广的形式有哪些
  • 网站建设公司无锡百度网盘下载
  • 现在企业做网站用什么软件竞价开户推广
  • 美女网站做国外广告怎么样中国企业网官方网站
  • 做优化网站建设排名优化公司电话
  • 网站建设和网站推广百度com百度一下你
  • 山东网站建设网站广州各区进一步强化
  • 河北提供网站制作公司电话做百度推广代运营有用吗
  • 宁波专业的网站建设百度域名注册
  • 怎样制作购物网站 微信转发什么是搜索引擎营销
  • 免费好用的wordpress主题优化推荐
  • 免费下载的网站中国软文网官网
  • 网站专题建设营销模式有几种
  • 书店商城网站建设方案百度经验官网首页
  • 网站开发毕业论文模板企业网站多少钱一年
  • 临沂做网站企业凡科小程序
  • 哪家网站做教育培训机构转让百度游戏风云榜
  • 网站的后台管理账号和密码汕头seo优化
  • 无锡政府门户网站建设的调查报告百度公司推广
  • 视频网站发展好应该怎么做seo关键词排名优化系统
  • 信息门户网站建设报价百度竞价点击工具
  • 网站建设的技术风险分析与规避网站制作免费
  • 廊坊市做网站最新疫情最新消息
  • 怎么看网站的ftp合肥网站优化推广方案
  • 青岛建网站的公司杭州关键词优化测试