onAttachedToWindow () 和 onDetachedFromWindow ()
2015-12-15 21:28
471 查看
protected void onAttachedToWindow()
This is called when the view is attached to a window. At this point it has a Surface and will start drawing. Note that this function is guaranteed to be called before onDraw(android.graphics.Canvas), however it may be called any time before the first onDraw – including before or after onMeasure(int, int).
如果你在自己的view中Override了这个方法。那么我们最关注的是它什么时候调用?
从开发文档中我们可以看出,onAttachedToWindow是在第一次onDraw前调用的。也就是我们写的View在没有绘制出来时调用的,但只会调用一次。
比如,我们写状态栏中的时钟的View,在onAttachedToWindow这方法中做初始化工作,比如注册一些广播等等……
与onAttachedToWindow 相反的则是这个方法:
protected void onDetachedFromWindow()
Since: API Level 1
This is called when the view is detached from a window. At this point it no longer has a surface for drawing.
开发文档就简单的两句。也就是我们销毁View的时候。我们写的这个View不再显示。
这时我们就在这个方法做一些收尾工作,如:取消广播注册等等。
究竟是如何的调用顺序,我在播放界面的Activity中重写了这2个方法,并在其中打印Log,下面我们来看一下运行效果。
onAttachedToWindow () 和 onDetachedFromWindow ()
A:表示刚进入视频播放页面时执行的一系列。
B:表示点击back键退出视频播放页面时执行的一些列操作
上面一个椭圆部分,表示播放视频的初始化操作。
下面一个椭圆部分,表示播放视频的销毁操作,比如释放资源。
由此可见,onAttachedToWindow在初始化视频播放(既创建view)之前调用,
onDetachedFromWindow在退出视频播放,销毁资源(既销毁view)之后调用。
在 Adroid2.1 和 Adroid2.2 设备上,如果 Activity 中使用到 ViewFlipper 控件,进行横竖屏切换操作时会发生如下错误信息:
1 Program crashes, giving this crash log:
2
3 java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper1@44b6ab904atandroid.app.ActivityThreadPackageInfo.forgetReceiverDispatcher(ActivityThread.java:667)
5 at android.app.ApplicationContext.unregisterReceiver(ApplicationContext.java:747)
6 at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:321)
7 at android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104)
8 at android.view.View.dispatchDetachedFromWindow(View.java:5835)
9 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1076)
10 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
11 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
12 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
13 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
14 at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1570)
15 at android.view.ViewRoot.doDie(ViewRoot.java:2556)
16 at android.view.ViewRoot.die(ViewRoot.java:2526)
17 at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:218)
18 at android.view.WindowLocalWindowManager.removeViewImmediate(Window.java:436)19atandroid.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3498)20atandroid.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3599)21atandroid.app.ActivityThread.access2300(ActivityThread.java:119)
22 at android.app.ActivityThreadH.handleMessage(ActivityThread.java:1867)23atandroid.os.Handler.dispatchMessage(Handler.java:99)24atandroid.os.Looper.loop(Looper.java:123)25atandroid.app.ActivityThread.main(ActivityThread.java:4363)26atjava.lang.reflect.Method.invokeNative(NativeMethod)27atjava.lang.reflect.Method.invoke(Method.java:521)28atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:860)
29 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
30 at dalvik.system.NativeStart.main(Native Method)
这是由于 onDetachedFromWindow() 莫名其妙地在 onAttachedToWindow() 之前被调用了。
先提供解决方案如下:
1.重载ViewFlipper的onDetachedFromWindow()方法,注意修改访问修饰符为public。
@Override
public void onDetachedFromWindow() {
}
若第一步不起作用,则在第一步的基础上,紧接着进行第二步:
重载Activity的onDetachedFromWindow()在其中加入
@Override
public void onDetachedFromWindow() {
}
当然进行第二步的前提是,你已经重载了ViewFlipper的onDetachdFromWindow()方法,既第一步。
This is called when the view is attached to a window. At this point it has a Surface and will start drawing. Note that this function is guaranteed to be called before onDraw(android.graphics.Canvas), however it may be called any time before the first onDraw – including before or after onMeasure(int, int).
如果你在自己的view中Override了这个方法。那么我们最关注的是它什么时候调用?
从开发文档中我们可以看出,onAttachedToWindow是在第一次onDraw前调用的。也就是我们写的View在没有绘制出来时调用的,但只会调用一次。
比如,我们写状态栏中的时钟的View,在onAttachedToWindow这方法中做初始化工作,比如注册一些广播等等……
与onAttachedToWindow 相反的则是这个方法:
protected void onDetachedFromWindow()
Since: API Level 1
This is called when the view is detached from a window. At this point it no longer has a surface for drawing.
开发文档就简单的两句。也就是我们销毁View的时候。我们写的这个View不再显示。
这时我们就在这个方法做一些收尾工作,如:取消广播注册等等。
究竟是如何的调用顺序,我在播放界面的Activity中重写了这2个方法,并在其中打印Log,下面我们来看一下运行效果。
onAttachedToWindow () 和 onDetachedFromWindow ()
A:表示刚进入视频播放页面时执行的一系列。
B:表示点击back键退出视频播放页面时执行的一些列操作
上面一个椭圆部分,表示播放视频的初始化操作。
下面一个椭圆部分,表示播放视频的销毁操作,比如释放资源。
由此可见,onAttachedToWindow在初始化视频播放(既创建view)之前调用,
onDetachedFromWindow在退出视频播放,销毁资源(既销毁view)之后调用。
在 Adroid2.1 和 Adroid2.2 设备上,如果 Activity 中使用到 ViewFlipper 控件,进行横竖屏切换操作时会发生如下错误信息:
1 Program crashes, giving this crash log:
2
3 java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper1@44b6ab904atandroid.app.ActivityThreadPackageInfo.forgetReceiverDispatcher(ActivityThread.java:667)
5 at android.app.ApplicationContext.unregisterReceiver(ApplicationContext.java:747)
6 at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:321)
7 at android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104)
8 at android.view.View.dispatchDetachedFromWindow(View.java:5835)
9 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1076)
10 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
11 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
12 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
13 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
14 at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1570)
15 at android.view.ViewRoot.doDie(ViewRoot.java:2556)
16 at android.view.ViewRoot.die(ViewRoot.java:2526)
17 at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:218)
18 at android.view.WindowLocalWindowManager.removeViewImmediate(Window.java:436)19atandroid.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3498)20atandroid.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3599)21atandroid.app.ActivityThread.access2300(ActivityThread.java:119)
22 at android.app.ActivityThreadH.handleMessage(ActivityThread.java:1867)23atandroid.os.Handler.dispatchMessage(Handler.java:99)24atandroid.os.Looper.loop(Looper.java:123)25atandroid.app.ActivityThread.main(ActivityThread.java:4363)26atjava.lang.reflect.Method.invokeNative(NativeMethod)27atjava.lang.reflect.Method.invoke(Method.java:521)28atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:860)
29 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
30 at dalvik.system.NativeStart.main(Native Method)
这是由于 onDetachedFromWindow() 莫名其妙地在 onAttachedToWindow() 之前被调用了。
先提供解决方案如下:
1.重载ViewFlipper的onDetachedFromWindow()方法,注意修改访问修饰符为public。
@Override
public void onDetachedFromWindow() {
// 因为该问题多发生于2.1或者2.2设备上,所以做此判断,如果其他API Level也出现类似情况,只要修 //改这个地方即可。 if (Build.VERSION.SDK_INT == 7) { try { super.onDetachedFromWindow(); } catch (IllegalArgumentException e) { Log.w(TAG, "Android project issue 6191 workaround."); e.printStackTrace(); } finally { super.stopFlipping(); } } else { super.onDetachedFromWindow(); }
}
若第一步不起作用,则在第一步的基础上,紧接着进行第二步:
重载Activity的onDetachedFromWindow()在其中加入
@Override
public void onDetachedFromWindow() {
if (myFlipper != null) { myFlipper.onDetachedFromWindow();// 第一步中修饰符修改为了public,这里才能访问到。 }
}
当然进行第二步的前提是,你已经重载了ViewFlipper的onDetachdFromWindow()方法,既第一步。
相关文章推荐
- 使用HttpURLConnection显示网页和下载图片
- 《5》CentOS7.0+OpenStack+kvm云平台的部署—组态Horizon
- RXTX Version mismatch
- C# 单例模式的五种写法
- Scrapy安装介绍
- C# 单例模式的五种写法
- IO碰到的问题
- IO碰到的问题
- 面试题 iOS OC
- 进程和程序的区别----生动讲解
- 使用 adb 调用 ActivityManager
- 实战c++中的vector系列--将迭代器转换为索引
- android app 延迟加载
- 实战c++中的vector系列--将迭代器转换为索引
- 值得推荐的C/C++框架和库 (真的很强大)
- ng-repeat指令中使用track by子语句解决重复数据遍历的错误
- NameValuePair is deprecated in API 22
- Swift-Kingfisher图片下载库
- Java 处理 iphone拍照后 图片EXIF属性翻转90度的方法
- IOS基础-UITableViewController