当前位置:  编程技术>移动开发
本页文章导读:
    ▪关于ThreadLocal的内存储器泄露        关于ThreadLocal的内存泄露 ThreadLocal是一种confinement,confinement和local及immutable都是线程安全的(如果JVM可信的话)。 因为对每个线程和value之间存在hash表,而线程数量未知,从表象来看ThreadLocal.........
    ▪ Activity属性设立大全(转)        Activity属性设置大全(转) android:allowTaskReparenting=["true" | "false"] 是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务。    android:alwaysRetainTaskState=["true" | "false"] 是否保留状.........
    ▪ TransitionDrawable&StateListDrawable的运用       TransitionDrawable&StateListDrawable的使用 这个SDK里面的一段代码: 比较适合来做一个简单的动画(比如文字的渐变放大效果等) Resources res = getResources(); TransitionDrawable transition = (TransitionDrawable).........

[1]关于ThreadLocal的内存储器泄露
    来源: 互联网  发布时间: 2014-02-18
关于ThreadLocal的内存泄露

ThreadLocal是一种confinement,confinement和local及immutable都是线程安全的(如果JVM可信的话)。 因为对每个线程和value之间存在hash表,而线程数量未知,从表象来看ThreadLocal会存在内存泄露,读了代码,发现实际上也可能会内存泄 露。

事实上每个Thread实例都具备一个ThreadLocal的map,以ThreadLocal Instance为key,以绑定的Object为Value。而这个map不是普通的map,它是在ThreadLocal中定义的,它和普通map的 最大区别就是它的Entry是针对ThreadLocal弱引用的,即当外部ThreadLocal引用为空时,map就可以把ThreadLocal交 给GC回收,从而得到一个null的key。

这个threadlocal内部的map在Thread实例内部维护了ThreadLocal Instance和bind value之间的关系,这个map有threshold,当超过threshold时,map会首先检查内部的ThreadLocal(前文说过,map 是弱引用可以释放)是否为null,如果存在null,那么释放引用给gc,这样保留了位置给新的线程。如果不存在slate threadlocal,那么double threshold。除此之外,还有两个机会释放掉已经废弃的threadlocal占用的内存,一是当hash算法得到的table index刚好是一个null key的threadlocal时,直接用新的threadlocal替换掉已经废弃的。另外每次在map中新建一个entry时(即没有和用过的或未清 理的entry命中时),会调用cleanSomeSlots来遍历清理空间。此外,当Thread本身销毁时,这个map也一定被销毁了(map在 Thread之内),这样内部所有绑定到该线程的ThreadLocal的Object Value因为没有引用继续保持,所以被销毁。

从上可以看出Java已经充分考虑了时间和空间的权衡,但是因为置为null的threadlocal对应的Object Value无法及时回收。map只有到达threshold时或添加entry时才做检查,不似gc是定时检查,不过我们可以手工轮询检查,显式调用 map的remove方法,及时的清理废弃的threadlocal内存。需要说明的是,只要不往不用的threadlocal中放入大量数据,问题不 大,毕竟还有回收的机制。

综上,废弃threadlocal占用的内存会在3中情况下清理:
1 thread结束,那么与之相关的threadlocal value会被清理
2 GC后,thread.threadlocals(map) threshold超过最大值时,会清理
3 GC后,thread.threadlocals(map) 添加新的Entry时,hash算法没有命中既有Entry时,会清理

那么何时会“内存泄露”?当Thread长时间不结束,存在大量废弃的ThreadLocal,而又不再添加新的ThreadLocal(或新添加的ThreadLocal恰好和一个废弃ThreadLocal在map中命中)时。


    
[2] Activity属性设立大全(转)
    来源: 互联网  发布时间: 2014-02-18
Activity属性设置大全(转)
android:allowTaskReparenting=["true" | "false"]
是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务。   

android:alwaysRetainTaskState=["true" | "false"]
是否保留状态不变,比如切换回home, 再从新打开, activity处于最后的状态       

android:clearTaskOnLaunch=["true"" | "false"]
比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P, 是否显示 Q         

android:configChanges=[one or more of: "mcc" "mnc" "locale" "touchscreen" "keyboard" "keyboardHidden" "navigation" "orientation" "fontScale"]
当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation".       

android:enabled=["true" | "false"]
activity 是否可以被实例化,        

android:excludeFromRecents=["true" | "false"]
是否可被显示在最近打开的activity列表里     

android:exported=["true" | "false"]
是否允许activity被其它程序调用        

android:finishOnTaskLaunch=["true" | "false"]
是否关闭已打开的activity当用户重新启动这个任务的时候    

android:icon="drawable resource"        
android:label="string resource"        

android:launchMode=["multiple" | "singleTop" |"singleTask" | "singleInstance"]
activity启动方式, "standard" "singleTop" "singleTask" "singleInstance" 其中前两个为一组, 后两个为一组       

android:multiprocess=["true" | "false"]          android:name="string"          android:noHistory=["true" | "false"]
是否需要移除这个activity当用户切换到其他屏幕时。 这个属性是 API level 3 中引入的       
android:permission="string"       

android:process="string"
一个activity运行时所在的进程名,所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。<application>中的元素process属性能够为所有组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中运行。 如果这个属性被分配的名字以:开头,当这个activity运行时, 一个新的专属于这个程序的进程将会被创建。如果这个进程名以小写字母开头,这个activity将会运行在全局的进程中,被它的许可所提供。     

android:screenOrientation=["unspecified" | "user" | "behind" |"landscape" | "portrait" | "sensor" | "nonsensor"]
activity显示的模式, "unspecified" 默认值 "landscape" 风景画模式,宽度比高度大一些 "portrait" 肖像模式, 高度比宽度大。 "user" 用户的设置 "behind" "sensor" "nosensor"        

android:stateNotNeeded=["true" | "false"]
   是否 activity被销毁和成功重启并不保存状态        

android:taskAffinity="string"
   activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系    

android:theme="resource or theme"
   activity的样式主题, 如果没有设置,则activity的主题样式从属于应用程序, 参见<application>元素的theme属性        

android:windowSoftInputMode=[one or more of: "stateUnspecified""stateUnchanged" "stateHidden" "stateAlwaysHidden" "stateVisible""stateAlwaysVisible""adjustUnspecified""adjustResize" "adjustPan"] > 
activity主窗口与软键盘的交互模式, 自从API level 3 被引入

    
[3] TransitionDrawable&StateListDrawable的运用
    来源: 互联网  发布时间: 2014-02-18
TransitionDrawable&StateListDrawable的使用
这个SDK里面的一段代码:
比较适合来做一个简单的动画(比如文字的渐变放大效果等)
Resources res = getResources();
		TransitionDrawable transition = (TransitionDrawable) res
				.getDrawable(R.drawable.expand_collapse);
		ImageView image = (ImageView) findViewById(R.id.toggle_image);
		image.setImageDrawable(transition);
		//当间隔一秒后显示
		transition.startTransition(1000);

这个expand_collapse.xml文件放到Drawable文件夹当中:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
	    <item android:drawable="@drawable/image_expand" />
		<item android:drawable="@drawable/image_collapse" />
</transition>

当然在测试的时候需要准备2张图片image_expand,image_collapse
http://xueinsz.iteye.com/blog/767585






根据Button状态(normal,focused,pressed)显示不同背景图片
1. 在res/drawable目录下添加一个xml文件,用来描述Button在不同状态下对应的不同图片。我这里给该xml文件命名为btn_background.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true"
           android:drawable="@drawable/btn_pressed" /> <!-- pressed -->
     <item android:state_focused="true"
           android:drawable="@drawable/btn_normal" /> <!-- focused -->
     <item android:drawable="@drawable/btn_normal" /> <!-- default -->
 </selector>

2. 在res/layout目录下,对应的layout xml文件中,将Button的android:background属性设置为btn_background即可。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/btn_background"
    />
</LinearLayout>


也可以代码实现:
Integer[] mButtonState = { R.drawable.defaultbutton,
                R.drawable.focusedpressed, R.drawable.pressed };
Button mButton = (Button) findViewById(R.id.button);
mButton.setBackgroundDrawable(myButton.setbg(mButtonState));

public StateListDrawable setbg(Integer[] mImageIds) {
            StateListDrawable bg = new StateListDrawable();
            Drawable normal = this.getResources().getDrawable(mImageIds[0]);
            Drawable selected = this.getResources().getDrawable(mImageIds[1]);
            Drawable pressed = this.getResources().getDrawable(mImageIds[2]);
            bg.addState(View.PRESSED_ENABLED_STATE_SET, pressed);
            bg.addState(View.ENABLED_FOCUSED_STATE_SET, selected);
            bg.addState(View.ENABLED_STATE_SET, normal);
            bg.addState(View.FOCUSED_STATE_SET, selected);
            bg.addState(View.EMPTY_STATE_SET, normal);
            return bg;
}

Drawable资源:StateListDrawable,PaintDrawable,ShapeDrawable,NinePatchDrawable,BitmapDrawable
http://www.cnblogs.com/xirihanlin/archive/2010/06/14/1758145.html

LayerDrawable层叠样式layer-list
http://gundumw100.iteye.com/admin/blogs/896923

代码实现ColorStateList及StateListDrawable
http://blog.csdn.net/sodino/article/details/6797821

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3