模仿源泉
Instant Heart Rate的地址
android-heart-rate-monitor
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background" > <com.jwetherell.heart_rate_monitor.HeartbeatView android:id="@+id/image" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="5dp" android:layout_marginTop="5dp" /> <SurfaceView android:id="@+id/preview" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="5dp" android:layout_marginTop="5dp" /> <TextView android:id="@+id/toptext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/image" android:layout_alignTop="@+id/image" android:layout_toLeftOf="@+id/preview" android:layout_toRightOf="@+id/image" android:gravity="center" android:text="@string/app_name" android:textSize="20sp" /> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" > <ProgressBar android:id="@+id/progressBar1" android:layout_width="250dp" android:layout_height="250dp" android:indeterminateDrawable="@drawable/heart_beat_layer_style" /> <TextView android:id="@+id/heartbeatnumbertext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|center_vertical" android:text="@string/default_text" android:textSize="45sp" /> </FrameLayout> <TextView android:id="@+id/bottomtext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="@string/discription" android:textSize="19sp" /> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <rotate android:drawable="@drawable/monitor_bg_full_" android:fromDegrees="0.0" android:pivotX="50.0%" android:pivotY="50.0%" android:toDegrees="360.0" /> </item> <item android:drawable="@drawable/monitor_bg"/> </layer-list>
整个程序的源码
第一、viewDidUnload方法
1.调用时机:
内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方。当系统内存吃紧的时候会调用该方法,释放view,释放的view必须是已经在内存的view,即通过viewdidload之后的view,而不是controller,在iphone应用程序,可以controller已经创建,但是view可以没有进内存,另外该方法不会是viewController release。
注意此时释放的对象应该是所有IBOutlet(无论是property还是实例变量)置为nil,在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等release对象后,将对象置为nil
注意:系统view时已经将其release掉了, 即self.view此时已经为空)
2.释放的对象
viewDidUnload中被release的对象必须是很容易被重新创建的对象(比如在viewDidLoad或其他方法中创建的对象),不要release用户数据或其他很难被重新创建的对象。
viewDidUnload 不会引发dealloc方法
第二.viewDidUnload工作内容
1、释放掉一些比较容易创建的对象,或者是一些比较占资源的对象(图片、音频等)
2、如果界面控件自己保持了引用计数,这里也要释放掉。(比如说,这个控件被设成了属性,而且是retain的,这个retain的引用计数就必须释放掉)
3、如果跨类的参数传递机制会在viewDidUnload以后产生不正常的效果,这里也必须处理。
第三 .viewDidUnload 和viewDidload的关系
一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行,viewDidLoad总是在loadView之后调用,不管你是不是通过nib文件创建的,这个方法总是会被调用的。
第四。viewDidUnload和dealloc
viewDidUnload和dealloc方法没有关联,viewDidUnload 不会引发dealloc方法
他们的触发原因不同,viewDieUnload是因为内存不够导致,dealloc是因为对象引用计数为零自动调用。
流程:
(loadView/nib文件)来加载view到内存 ——>viewDidLoad函数进一步初始化这些view ——>内存不足时,调用viewDidUnload函数释放views —->当需要使用view时有回到第一步,如此循环。
这个安卓开发过程中eclipse的提示,新浪网友给出这个解决方法:http://blog.sina.com.cn/s/blog_5ea8670101015dgk.html 太笨了。
看看stackoverflow给出的办法: 直接将“-”符号替换为“–” (不含双引号).