哪些listener需要在finish ondestroyy时释放

Android WebView中那些不得不解决的坑~~ - 推酷
Android WebView中那些不得不解决的坑~~
前面那张hybrid开发心得 有人问 怎么解决不用onJsPrompt 来回调js函数的问题。其实很简单,就是在在你的jscalljava回调函数内 另外开个线程去load js代码即可:
1 wb.post(new Runnable() {
public void run() {
wb.loadUrl(&javascript:display_alert()&);
好,然后开始说一下webview。webview其实我一直都很痛恨这个控件,你又不能不用,但是一旦大规模测试起来 你就发现这个webview真是坑。。。各种你想不到的错误 在各种奇怪的手机,各种不一样的版本里
出现各种难以预料的问题。再加上monkey 时不时的 帮你跑点crush,乌云平台时不时给你爆点漏洞,感觉webview天生就是在考验开发者的奇技淫巧。我自己也总结了下webview 下面的开发注意事项,现在总结出来,
希望能给你今后webview开发中 扫平一些障碍 提供一些帮助。
1.WebView的内存泄露。
关于这个问题,我很难给你一个清晰的描述,你在谷歌里搜 webview lead memory 能搜到很多结果 甚至还有给谷歌提交的issue 哈哈,我也无法给出一个清晰的答案 在什么时候 什么版本那些手机上一定会出现内存泄露,
但是根据我自己的monkey结果来看,有时,webview内存泄露的情况还是很严重的,尤其是当你加载的页面比较庞大的时候。解决方案 我查了很多也用了很多,但是都不太理想,最后看了下微信和qq的做法,试了一下是目前效果最好的,
就是 当你要用webview的时候,记得最好 另外单独开一个进程 去使用webview 并且当这个 进程结束时,请手动调用System.exit(0)。
这是目前对于webview 内存泄露 最好的解决方案。使用此方法 所有因为webview引发的 资源无法释放等问题 全部可以解决。
2.getSettings().setBuiltInZoomControls(true) 引发的crush。
这个方法调用以后 如果你触摸屏幕 弹出那个提示框还没消失的时候 你如果activity结束了 就会报错了。3.0以上 4.4以下很多手机会出现这种情况
所以为了规避他,我们通常是在activity的onDestroy方法里手动的将webiew设置成&setVisibility(View.GONE)
3.onPageFinished 函数到底有用没有?
多数开发者都是参考的/questions/3149216/how-to-listen-for-a-webview-finishing-loading-a-url-in-android 这个上面的高票答案。
但其实根据我自己观察,这个函数并没有什么卵用,有的时候是提前结束,有的时候就迟迟无法结束,你信这个函数 还不如信上帝,甚至于onProgressChanged这个函数
都比onPageFinished &要准一些。如果你的产品经理坚持你一定要实现这种功能的话,我建议你 提早结束他,否则卡在那用户迟迟动不了 这种体验不好。
有空的同学可以跟一下源码,onPageFinished &在不同的内核里 调用的时机都不一样。说实话 我也很醉。。。这个问题 有完美解决方案的 请知会我一下。。。
4.后台无法释放js 导致耗电。
这个可能很少有人知道,我也是被投诉过 才了解,在有的手机里,你如果webview加载的html里 有一些js 一直在执行比如动画之类的东西,如果此刻webview 挂在了后台
这些资源是不会被释放 用户也无法感知。。。导致一直占有cpu 耗电特别快,所以大家记住了,如果遇到这种情况 请在onstop和onresume里分别把setJavaScriptEnabled();
给设置成false和true。
5.如果实在不想用开额外进程的方式解决webview 内存泄露的问题,那么下面的方法很大程度上可以避免这种情况
public void releaseAllWebViewCallback() {
if (android.os.Build.VERSION.SDK_INT & 16) {
Field field = WebView.class.getDeclaredField(&mWebViewCore&);
field = field.getType().getDeclaredField(&mBrowserFrame&);
field = field.getType().getDeclaredField(&sConfigCallback&);
field.setAccessible(true);
field.set(null, null);
} catch (NoSuchFieldException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
} catch (IllegalAccessException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
Field sConfigCallback = Class.forName(&android.webkit.BrowserFrame&).getDeclaredField(&sConfigCallback&);
if (sConfigCallback != null) {
sConfigCallback.setAccessible(true);
sConfigCallback.set(null, null);
} catch (NoSuchFieldException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
} catch (IllegalAccessException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
在webview的 destroy方法里 调用这个方法就行了。
6.另外很多人 不知道webview 实际上有自己一套完整的cookie机制的,利用好这个 可以大大增加对客户端的访问速度。
实际上cookie就是存放在这个表里的。
很多人都想要一个效果:网页更新cookie 设置完cookie以后 不刷新页面即可生效。这个在2.3以下和2.3以上要实现的方法不太一样,所以要做一次兼容
public void updateCookies(String url, String value) {
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.GINGERBREAD_MR1) { // 2.3及以下
CookieSyncManager.createInstance(getContext().getApplicationContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(url, value);
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.GINGERBREAD_MR1) {
CookieSyncManager.getInstance().sync();
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致您所在的位置: &
详解Listener监听Http Session
详解Listener监听Http Session
中国IT实验室
本文详细介绍Listener监听Http Session,以及介绍OnLine Count Listener调用session Created的方法,
Listener 是Servlet 的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个 Http Session时,就激发session Created(Http Session Event se)方法,这样就可以给在线人数加1。常用的监听接口有以下几个:
Servlet Context Attribute Listener监听对Servlet Context 属性的操作,比如增加、删除、修改属性。
Servlet Context Listener监听Servlet Context 。当创建Servlet Context 时,激发Context Initialized (Servlet Context Event sce)方法;当销毁Servlet Context 时,激发Context Destroyed(Servlet Context Event sce)方法。
Http Session Listener监听Http Session的操作。当创建一个Session时,激发session Created(Http Session Event se)方法;当销毁一个Session时,激发session Destroyed (Http Session Event se)方法。
Http Session Attribute Listener监听Http Session中的属性的操作。当在Session增加一个属性时,激发attribute Added (Http Session Binding Event se) 方法;当在Session删除一个属性时,激发attribute Removed(Http Session Binding Event se)方法;当在Session属性被重新设置时,激发attribute Replaced(Http Session Binding Event se) 方法。
下面我们开发一个具体的例子,这个监听器能够统计在线的人数。在Servlet Context 初始化和销毁时,在服务器控制台打印对应的信息。当Servlet Context 里的属性增加、改变、删除时,在服务器控制台打印对应的信息。
要获得以上的功能,监听器必须实现以下3个接口:◆HttpSessionListener◆Servlet Context Listener◆Servlet Context AttributeListenerimport&javax.servlet.http.*; &import&javax.servlet.*; &public&class&OnLineCountListener&implements&HttpSessionListener, &ServletContextListener,ServletContextAttributeListener &{ &private&int& &private&ServletContext&context&=&null; &public&OnLineCountListener() &{ &count=0; &//setContext(); &} &//创建一个session时激发 &public&void&sessionCreated(HttpSessionEvent&se) &{ &count++; &setContext(se); &} &//当一个session失效时激发 &public&void&sessionDestroyed(HttpSessionEvent&se) &{ &count--; &setContext(se); &} &//设置context的属性,它将激发attributeReplaced或attributeAdded方法 &public&void&setContext(HttpSessionEvent&se) &{ &se.getSession().getServletContext(). &setAttribute("onLine",new&Integer(count)); &} &//增加一个新的属性时激发 &public&void&attributeAdded(ServletContextAttributeEvent&event)&{ &log("attributeAdded('"&+&event.getName()&+&"',&'"&+ &event.getValue()&+&"')"); &} &//删除一个新的属性时激发 &public&void&attributeRemoved(ServletContextAttributeEvent&event)&{ &log("attributeRemoved('"&+&event.getName()&+&"',&'"&+ &event.getValue()&+&"')"); &} &//属性被替代时激发 &public&void&attributeReplaced(ServletContextAttributeEvent&event)&{ &log("attributeReplaced('"&+&event.getName()&+&"',&'"&+ &event.getValue()&+&"')"); &} &//context删除时激发 &public&void&contextDestroyed(ServletContextEvent&event)&{ &log("contextDestroyed()"); &this.context&=&null; &} &//context初始化时激发 &public&void&contextInitialized(ServletContextEvent&event)&{ &this.context&=&event.getServletContext(); &log("contextInitialized()"); &} &private&void&log(String&message)&{ &System.out.println("ContextListener:&"&+&message); &} &}&
在OnLine Count Listener 里,用count代表当前在线的人数,OnLine Count Listener将在Web服务器启动时自动执行。当 OnLine Count Listener构造好后,把count设置为0。每增加一个Session,OnLine Count Listener会自动调用 session Created(Http Session Event se)方法;每销毁一个Session,OnLine Count Listener会自动调用session Destroyed (Http Session Event se)方法。当调用session Created(Http Session Event se)方法时,说明又有一个客户在请求,此时使在线的人数(count)加1,并且把count写到Servlet Context 中。 Servlet Context 的信息是所有客户端共享的,这样,每个客户端都可以读取到当前在线的人数。
从作用域范围来说,Servlet 的作用域有Servlet Context ,Http Session,Servlet Request.以上是Listener监听Http Session
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
AngularJS是很多Web开发人员在打造单页面应用程序时的首选创建方
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
讲师: 15人学习过讲师: 35人学习过讲师: 15人学习过
前几天和长辈闲聊之下,“大数据”,竟然也从老人家嘴
刚刚走出校园,打算在求职市场上一展英姿?各位年轻的
计算机语言在保质期方面有着与众不同的独特规律。其中
Java学习笔记在JavaWorld技术论坛(.tw/)和作者的网站(http://caterpillar.onlyfun.net/Gossip/)提
51CTO旗下网站activity反复进来onDestroy onCreate方法 - 移动开发当前位置:& &&&activity反复进来onDestroy onCreate方法activity反复进来onDestroy onCreate方法&&网友分享于:&&浏览:6次activity反复进入onDestroy onCreate方法问题:pad平放在桌子上,无任何操作,activity会反复进入onDestroy onCreate方法
加了此属性android:configChanges=&keyboardHidden|orientation&,好了,可是我并没有进行横竖屏切换
activity中注册了180度重力感应的代码new MySensorEventListener(this).register(); &可是也没有进行180度的切换
所以问题是好了,但问题的确切出处还不清楚
1,MySensorEventListener&180度重力感应类
package cn.zhl.
import android.app.A
import android.content.pm.ActivityI
import android.hardware.S
import android.hardware.SensorE
import android.hardware.SensorEventL
import android.hardware.SensorM
public class MySensorEventListener {
public MySensorEventListener(Activity activity) {
this.activity =
public void register() {
// 重力感应侦听器
SensorEventListener lsn = new SensorEventListener() {
public void onAccuracyChanged(Sensor s, int accuracy) {
public void onSensorChanged(SensorEvent e) {
// TODO Auto-generated method stub
float x, y,
x = e.values[SensorManager.DATA_X];
y = e.values[SensorManager.DATA_Y];
z = e.values[SensorManager.DATA_Z];
TurnScreen(x, y, z);
SensorManager sensorMgr = (SensorManager) activity
.getSystemService(activity.SENSOR_SERVICE);
Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 注册重力感应侦听器,第三个参数是检测的精确度
sensorMgr.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_UI);
* 根据重力感应侦测信号,屏幕180度翻转
* @param x
x轴值,-10~10
* @param y
y轴值,-10~10
* @param z
z轴值,-10~10
private void TurnScreen(float x, float y, float z) {
// 横屏正方向
if (activity.getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
&& y & -5) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
// 横屏反方向
else if (activity.getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
&& y & 5) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// 纵屏正方向
else if (activity.getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
&& x & 5) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
// 纵屏反方向
else if (activity.getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
&& x & -5) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
一般在AndroidManifest.xml文件中都没有使用到android:configChanges=&keyboardHidden|orientation&配置,当然还是很有用的哈
就是如果配置了这个属性,当我们横竖屏切换的时候会直接调用onCreate方法中的onConfigurationChanged方法,而不会重新执行onCreate方法,那当然如果不配置这个属性的话就会重新调用onCreate方法了,下面是测试
package com.
import android.app.A
import android.content.res.C
import android.os.B
import android.widget.EditT
import android.widget.TextV
public class TestActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et = (EditText) findViewById(R.id.et);
tv = (TextView) findViewById(R.id.tv);
System.out.println(&我是onCreate方法&);
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
tv.setText(&横屏&);
tv.setText(&竖屏&);
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 service ondestroy 的文章

 

随机推荐