Android图片android内存优化 汇总的几点心得

您所在的位置: &
Android之ListView原理学习与优化总结
Android之ListView原理学习与优化总结
利用ViewHolder来优化ListView数据加载,仅仅就此一条吗?其实不是的,首先,想要优化ListView就得先了解ListView加载数据原理,这是前提,但是小马在这个地方先做一些简单的补充,大家一定仔细看下,保证会有收获的。
在整理前几篇文章的时候有朋友提出写一下ListView的性能优化方面的东西,这个问题也是小马在面试过程中被别人问到的&..今天小马就借此机会来整理下,网上类似的资料蛮多的,倒不如自己写一篇,记录在这个地方,供自己以后使用,不用再翻来翻去的找了,用自己写的&呵呵,不多讲其它了,说起优化我想大家第一反应跟小马一样吧?想到利用ViewHolder来优化ListView数据加载,仅仅就此一条吗?其实不是的,首先,想要优化ListView就得先了解ListView加载数据原理,这是前提,但是小马在这个地方先做一些简单的补充,大家一定仔细看下,保证会有收获的:
列表的显示需要三个元素:
&用来展示列表的View。
用来把数据映射到ListView上
数据:&&&&具体的将被映射的字符串,图片,或者基本组件。&
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,这三种适配器的使用大家可学习下官网上面的使用或者自行百度谷歌,一堆DEMO!!!其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方便的把数据库的内容以列表的形式展示出来。
系统要绘制ListView了,他首先用getCount()函数得到要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(这个看实际情况,如果是一个简单的显示则是View,如果是一个自定义的里面包含很多控件的时候它其实是一个ViewGroup),然后再实例化并设置各个组件及其数据内容并显示它。好了,绘制完这一行了。那&再绘制下一行,直到绘完为止,前面这些东西做下铺垫,继续&&.
现在我们再来了解ListView加载数据的原理,有了这方面的了解后再说优化才行,下面先跟大家一起来看下ListView加载数据的基本原理小马就直接写了:
ListView的工作原理如下:
针对每个item,要求 adapter &返回一个视图&
(getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到ListView的长度,然后根据这个长度,调用getView()一行一行的绘制ListView的每一项。如果你的getCount()返回值是0的话,列表一行都不会显示,如果返回1,就只显示一行。返回几则显示几行。如果我们有几千几万甚至更多的item要显示怎么办?为每个Item创建一个新的View?不可能!!!实际上Android早已经缓存了这些视图,大家可以看下下面这个截图来理解下,这个图是解释ListView工作原理的最经典的图了大家可以收藏下,不懂的时候拿来看看,加深理解,其实Android中有个叫做Recycler的构件,顺带列举下与Recycler相关的已经由Google做过N多优化过的东东比如:AbsListView.RecyclerListener、ViewDebug.RecyclerTraceType等等,要了解的朋友自己查下,不难理解,下图是ListView加载数据的工作原理(原理图看不清楚的点击后看大图):
下面简单说下上图的原理:
如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目存在内存(内存内存哦,说的优化就是说在内存中的优化!!!)中,其他的在Recycler中
ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的
当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图
下面来看下小马从网上找来的示例代码,网址搞丢了,只有一个word文档,只能
copy过来,不然直接贴网址,结合上面的原理图一起加深理解,如下:
public&class&MultipleItemsList&extends&ListActivity&{&&&&&private&MyCustomAdapter&mA&&&&&@Override&&&&&public&void&onCreate(Bundle&savedInstanceState)&{&&&&&&&&&super.onCreate(savedInstanceState);&&&&&&&&&mAdapter&=&new&MyCustomAdapter();&&&&&&&&&for&(int&i&=&0;&i&&&50;&i++)&{&&&&&&&&&&&&&mAdapter.addItem(&item&&&+&i);&&&&&&&&&}&&&&&&&&&setListAdapter(mAdapter);&&&&&}&&&&&private&class&MyCustomAdapter&extends&BaseAdapter&{&&&&&&&&private&ArrayList&mData&=&new&ArrayList();&&&&&&&&&private&LayoutInflater&mI&&&&&&&&&&public&MyCustomAdapter()&{&&&&&&&&&&&&&mInflater&=&(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);&&&&&&&&&}&&&&&&&&public&void&addItem(final&String&item)&{&&&&&&&&&&&&&mData.add(item);&&&&&&&&&&&&notifyDataSetChanged();&&&&&&&&&}&&&&&&&&&&@Override&&&&&&&&public&int&getCount()&{&&&&&&&&&&&&&return&mData.size();&&&&&&&&&}&&&&&&&&&@Override&&&&&&&&&public&String&getItem(int&position)&{&&&&&&&&&&&&&return&mData.get(position);&&&&&&&&&}&&&&&&&&&&@Override&&&&&&&&public&long&getItemId(int&position)&{&&&&&&&&&&&&return&&&&&&&&&}&&&&&&&&&&@Override&&&&&&&&public&View&getView(int&position,&View&convertView,&ViewGroup&parent)&{&&&&&&&&&&&&&System.out.println(&getView&&&+&position&+&&&&&+&convertView);&&&&&&&&&&&&ViewHolder&holder&=&&&&&&&&&&&&&&if&(convertView&==&null)&{&&&&&&&&&&&&&&&&&convertView&=&mInflater.inflate(R.layout.item1,&null);&&&&&&&&&&&&&&&&&holder&=&new&ViewHolder();&&&&&&&&&&&&&&&&holder.textView&=&(TextView)convertView.findViewById(R.id.text);&&&&&&&&&&&&&&&&&convertView.setTag(holder);&&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&holder&=&(ViewHolder)convertView.getTag();&&&&&&&&&&&&}&&&&&&&&&&&&&holder.textView.setText(mData.get(position));&&&&&&&&&&&&&return&convertV&&&&&&&&}&&&&}&&&&&public&static&class&ViewHolder&{&&&&&&&&&public&TextView&textV&&&&&}&}&&
执行程序,查看日志:
被调用 9 次 ,convertView&对于所有的可见项目是空值(如下):
然后稍微向下滚动List,直到item10出现:
&&&&&&convertView仍然是空值,因为recycler中没有视图(item1的边缘仍然可见,在顶端)再滚动列表,继续滚动:
&&&&&convertView不是空值了!item1离开屏幕到Recycler中去了,然后item11被创建,再滚动下:
此时的convertView非空了,在item11离开屏幕之后,它的视图(&0f8)作为convertView容纳item12了,好啦,结合以上原理,下面来看看今天最主要的话题,主角ListView的优化:
&&&&&&&&&&&&首先,这个地方先记两个ListView优化的一个小点:
&&&&&&&&&&&&&&&&&&&&&&1.
ExpandableListView 与 ListActivity
由官方提供的,里面要使用到的ListView是已经经过优化的ListView,如果大家的需求可以用Google自带的ListView满足的的话尽量用官方的,绝对没错!
&&&&&&&&&&&&&&&&&&&&&&2.其次,像小马前面讲的,说ListView优化,其实并不是指其它的优化,就是内存是的优化,提到内存&(想到OOM,折腾了我不少时间),很多很多,先来写下,如果我们的ListView中的选项仅仅是一些简单的TextView的话,就好办啦,消耗不了多少的,但如果你的Item是自定义的Item的话,例如你的自定义Item布局ViewGroup中包含:按钮、图片、flash、CheckBox、RadioButton等一系列你能想到的控件的话,
你要在getView中单单使用文章开头提到的ViewHolder是远远不够的,如果数据过多,加载的图片过多过大,你BitmapFactory.decode的猛多的话,OOM搞死你,这个地方再警告下大家,是警告&&&.也提醒下自己:
&&&&&&&&&&&&&&&&&&&&&&&&小马碰到的问题大家应该也都碰到过的,自定义的ListView项乱序问题,我很天真的在getView()中强制清除了下ListView的缓存数据convertView,也就是convertView&=
null了,虽然当时是解决了这个问题让其它每次重绘,但是犯了大错了,如果数据太多的话,出现最最恶心的错,手机卡死或强制关机,关机啊哥哥们&&O_O,客户杀了我都有可能,但大家以后别犯这样的错了,单单使用清除缓存convertView是解决不了实际问题的,继续&&
下面是小记:图片用完了正确的释放&&
if(!bmp.isRecycle()&){&&&&&&&&bmp.recycle()&&&//回收图片所占的内存&&system.gc()&&//提醒系统及时回收&}&&
下面来列举下真正意义上的优化吧:
&ViewHolder
&&Tag 必不可少,这个不多说!
如果自定义Item中有涉及到图片等等的,一定要狠狠的处理图片,图片占的内存是ListView项中最恶心的,处理图片的方法大致有以下几种:
2.1:不要直接拿个路径就去循环decodeFile();这是找死&.用Option保存图片大小、不要加载图片到内存去;
&拿到的图片一定要经过边界压缩
2.3:在ListView中取图片时也不要直接拿个路径去取图片,而是以WeakReference(使用WeakReference代替强引用。比如可以使
&&&&&&&用WeakReference&mContextRef)、SoftReference、WeakHashMap等的来存储图片信息,是图片信息不是图片哦!
2.4:在getView中做图片转换时,产生的中间变量一定及时释放,用以下形式:
尽量避免在BaseAdapter中使用static
来定义全局静态变量,我以为这个没影响
,这个影响很大,static是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(比如Context的情况最多),这时就要尽量避免使用了..
如果为了满足需求下必须使用Context的话:Context尽量使用Application
Context,因为Application的Context的生命周期比较长,引用它不会出现内存泄露的问题
尽量避免在ListView适配器中使用线程,因为线程产生内存泄露的主要原因在于线程生命周期的不可控制
&记下小马自己的错误:
之前使用的自定义ListView中适配数据时使用AsyncTask自行开启线程的,这个比用Thread更危险,因为Thread只有在run函数不&结束时才出现这种内存泄露问题,然而AsyncTask内部的实现机制是运用了线程执行池(ThreadPoolExcutor,要想了解这个类的话大家加下我们的Android开发群五号,因为其它群的存储空间快满了,所以只上传到五群里了,看下小马上传的Gallery源码,你会对线程执行池、软、弱、强引用有个更深入的认识),这个类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的,因此如果AsyncTask作为Activity的内部类,就更容易出现内存泄露的问题。这个问题的解决办法小马当时网上查到了记在txt里了,如下:&
6.1:将线程的内部类,改为静态内部类。
6.2:在线程内部采用弱引用保存Context引用
示例代码如下:
public&abstract&class&WeakAsyncTask&extends& AsyncTask&{&&&&&&&&&protected&WeakReference&mT&&&&&&&&&&&&public&WeakAsyncTask(WeakTarget&target)&{&&&&&&&&&&&&&mTarget&=&new&WeakReference(target);&&&&&&&&&}&&&&&&&&&&&&&&&&&&@Override&&&&&&&&protected&final&void&onPreExecute()&{&&&&&&&&&&&&final&WeakTarget&target&=&mTarget.get();&&&&&&&&&&&&&if&(target&!=&null)&{&&&&&&&&&&&&&&&&&this.onPreExecute(target);&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&@Override&&&&&&&&&protected&final&Result&doInBackground(Params...&params)&{&&&&&&&&&&&&&final&WeakTarget&target&=&mTarget.get();&&&&&&&&&&&&if&(target&!=&null)&{&&&&&&&&&&&&&&&&&return&this.doInBackground(target,&params);&&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&@Override&&&&&&&&protected&final&void&onPostExecute(Result&result)&{&&&&&&&&&&&&&final&WeakTarget&target&=&mTarget.get();&&&&&&&&&&&&&if&(target&!=&null)&{&&&&&&&&&&&&&&&&&this.onPostExecute(target,&result);&&&&&&&&&&&}&&&&&&&&}&&&&&&&&&&protected&void&onPreExecute(WeakTarget&target)&{&&&&&&&&&&&&//&No&default&action&&&&&&&&&}&&&&&&&&&&&&protected&abstract&Result&doInBackground(WeakTarget&target,&Params...&params);&&&&&&&&&&&protected&void&onPostExecute(WeakTarget&target,&Result&result)&{&&&&&&&&&&&&//&No&default&action&&&&&&&&&}&&&&&}&&
好啦,ListVIew的优化问题,小马就暂时先理解记录这么多了,如果朋友们有什么更好的优化建议什么的,留言指点下小马,一定会及时添加到进来的,先谢谢啦,其实在ListView适配器的getView()方法中可以做很多的优化,我记得还有可以优化findViewById()这个方法来寻址资源信息效率的方法,资料太多了,小马发现了会及时更新的哦,天太晚了,先休息了,吼吼,大家加油,一起努力学习!!!O_O【编辑推荐】【责任编辑: TEL:(010)】
关于&&&&&&的更多文章
《Android 4 游戏入门经典(第3版)》将赋予您惊人的灵感,带您开
既然强大的Android Studio来了,有什么理由不去用呢?
在经过数月以及6个测试版本的体验后,iOS 7正式版终于
微软的思路很明确。一个消费者需要拥有几款电子设备?
中秋已过,圆圆的月亮似乎是一个害羞的姑娘,带上了一
本书是对《网管员必读―网络管理》第1版的全面重写,因为书中所涉及的两个主要网络操作系统都已升级。本书介绍的是Windows Serve
Windows Phone专家
Android开发专家
51CTO旗下网站5月12日,上海市徐汇区人民政府与微软(中国)有限公司在徐汇区政府签订以“合作推进双创社区建设”为主题的战略合作备忘录。上海仪电作为徐汇区政府“双创社区”运营合作伙伴,与微软中国签署了“微软创投加速器
★青春是无价而短暂的,展现自我是上苍赠予我们最珍贵的礼物,我们应该最大限度地挖掘自己的才能,让青春尽情飞扬,
平 台 强 烈 推 荐Q Q在线【】 本团队通过特别的渠道,对客户需要查询的手机号码进行的
校企合作第一品牌-校企桥:第一时间分享业内最前沿资讯!
马坝人关注马坝微生活,每天推送马坝热点资讯!
多人在线强交互n无限转职嗨个够
程序猿最好奇的薪酬排行榜。
hello ios,hello world
ios开发如今市场待遇月入过万也很正常,但是你适合参加吗?
继Vidyo之后的又一款录屏App「Airshou」使用教程注:「Airshou」并没有上架AppStore#include &windows.h&
#include &stdio.h&
#include &process.h&
#include &iostream&
#include &msgqueue.h&
hWriteMsgQ
const TCHAR szevtWriteComMsgQueue[] = TEXT("WriteComMsgQueue");
//写消息队列
const TCHAR szevtReadComMsgQueue[] = TEXT("ReadComMsgQueue");
//读消息对列
InitCommMsgQueue(void) //
初始化系统用到的消息队列
MSGQUEUEOPTIONS
options.dwSize
sizeof(MSGQUEUEOPTIONS);
options.dwFlags
//options.dwMaxMessages
QUEUE_ENTRIES;
//options.cbMaxMessage
sizeof(POWER_BROADCAST)+MAX_NAMELEN;
options.dwMaxMessages=1;
options.cbMaxMessage=10;
options.bReadAccess=TRUE;
//options.bReadAccess=FALSE;
hReadMsgQueue=CreateMsgQueue(szevtWriteComMsgQueue,&options);
读写的消息句柄是不相同的!!!
if(hReadMsgQueue==NULL)
RETAILMSG(1,(TEXT("[BSP]++++1111::InitCommMsgQueue(
)----in failure/r/n")));
RETAILMSG(1,(TEXT("[BSP]++++1111::InitCommMsgQueue(
)----in success/r/n")));
RETAILMSG(1,(TEXT("[BSP]++++1111-1::InitCommMsgQueue(
)----the hReadMsgQueue is 0x%x/r/n"),hReadMsgQueue));
//--------------------------------------------
//MSGQUEUEOPTIONS
options.dwSize
sizeof(MSGQUEUEOPTIONS);
options.dwFlags
//options.dwMaxMessages
QUEUE_ENTRIES;
//options.cbMaxMessage
sizeof(POWER_BROADCAST)+MAX_NAMELEN;
options.dwMaxMessages=1;
options.cbMaxMessage=10;
// options.bReadAccess=TRUE;
options.bReadAccess=FALSE;
hWriteMsgQueue=CreateMsgQueue(szevtReadComMsgQueue,&options);//
读写的消息句柄是不相同的!!!
if(hWriteMsgQueue==NULL)
RETAILMSG(1,(TEXT("[BSP]++++2222::InitCommMsgQueue(
)----in failure/r/n")));
RETAILMSG(1,(TEXT("[BSP]++++2222::InitCommMsgQueue(
)----in success/r/n")));
RETAILMSG(1,(TEXT("[BSP]++++2222-1::InitCommMsgQueue(
)----the hWriteMsgQueue is 0x%x/r/n"),hWriteMsgQueue));
WriteMsgQueue(void)
tempByte[10];
for(i=0;i&10;i++)
tempByte[i]=0x30+i;
dwTimeout=INFINITE;
dwFlags=MSGQUEUE_MSGALERT ;
//警告消息
dwFlags=2;
if(hReadMsgQueue==NULL)
RETAILMSG(1,(TEXT("[BSP]++++WriteMsgQueue(
)----the hReadMsgQueue is NULL/r/n")));
if(hWriteMsgQueue==NULL)
RETAILMSG(1,(TEXT("[BSP]++++WriteMsgQueue(
)----the hWriteMsgQueue is NULL/r/n")));
// bRet=WriteMsgQueue(hReadMsgQueue, tempByte,10,dwTimeout,dwFlags);
bRet=WriteMsgQueue(hWriteMsgQueue, tempByte,10,dwTimeout,dwFlags);
dwError=GetLastError( );
//句柄无效???
RETAILMSG(1,(TEXT("[BSP]++++WriteMsgQueue(
)----the dwError is 0x%x/r/n"),dwError));
RETAILMSG(1,(TEXT("[BSP]++++WriteMsgQueue(
)----in success/r/n")));
RETAILMSG(1,(TEXT("[BSP]++++WriteMsgQueue(
)----in failure/r/n")));
DWORD WaitMsgQueueThread(LPVOID lparam)
unsigned long nRead = 0, flags = 0, res = 0;
ByteBuf[10];
RETAILMSG(1,(TEXT("[BSP]++++WaitMsgQueueThread(
)----Running/r/n")));
DWORD dwRes = WaitForSingleObject(hReadMsgQueue,INFINITE);
DWORD dwRes = WaitForSingleObject(hWriteMsgQueue,INFINITE);
if(dwRes==WAIT_OBJECT_0)
RETAILMSG(1,(TEXT("[BSP]++++WaitMsgQueueThread(
)----/r/n")));
memset(&ByteBuf,
if (ReadMsgQueue(hReadMsgQueue, &ByteBuf, 10, &nRead, INFINITE, &flags))
for(i=0;i&nRi++)
RETAILMSG(1,(TEXT("[BSP]++++WaitMsgQueueThread(
)----the index is %d,the data is 0x%x/r/n"),i,ByteBuf[i]));
}// if(dwRes==WAIT_OBJECT_0)
}//while(1)
------解决方案--------------------VC 下没这个头文件吧
------解决方案--------------------
CreateMsgQueue,,这个是CE下的
Android加载大图片内存溢出的有关问题总结
Android加载大图片内存溢出的问题总结
尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用JNI&&nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。如果在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常另外,decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应,使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源,否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。另外,以下方式也大有帮助:1. InputStream is = this.getResources().openRawResource(R.drawable.pic1);BitmapFactory.Options options=new BitmapFactory.Options();options.inJustDecodeBounds =options.inSampleSize = 10; //width,hight设为原来的十分一Bitmap btp =BitmapFactory.decodeStream(is,null,options);2. if(!bmp.isRecycle() ){bmp.recycle() //回收图片所占的内存system.gc() //提醒系统及时回收}以下奉上一个方法://以最省内存的方式读取本地资源的图片public static Bitmap readBitMap(Context context, int resId){BitmapFactory.Options opt = new BitmapFactory.Options();opt.inPreferredConfig = Bitmap.Config.RGB_565;opt.inPurgeable =//设为true表示当系统要内存的时候,可以回收它
//如果图片当有需要可以被回收的话,这个opt.inInputShareable=可以让bitmap共享他人的数据
//This field works in conjuction with inPurgeable. If inPurgeable is false, then this field is ignored. If inPurgeable is true, then this field determines whether the bitmap can share a reference to the input data (inputstream, array, etc.) or if it must make a deep copy.
opt.inInputShareable =//获取资源图片InputStream is = context.getResources().openRawResource(resId);return BitmapFactory.decodeStream(is,null,opt);}================================================================================Android内存溢出的解决办法转自:/iuranus/a ... 4394.html?opt=admin昨天在模拟器上给gallery放入图片的时候,出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget 异常,图像大小超过了RAM内存。模拟器RAM比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况,放入到Bitmap的时候,大小会变大,导致超出RAM内存,具体解决办法如下://解决加载图片 内存溢出的问题//Options 只保存图片尺寸大小,不保存图片到内存BitmapFactory.Options opts = new BitmapFactory.Options();//缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰opts.inSampleSize = 4;Bitmap bmp =bmp = BitmapFactory.decodeResource(getResources(), mImageIdsposition ,opts);...//回收bmp.recycle();通过上面的方式解决了,但是这并不是最完美的解决方式。通过一些了解,得知如下:优化Dalvik虚拟机的堆内存分配对于Android平台来说,其托管层使用的Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体 原理我们可以参考开源工程,这里我们仅说下使用方法: private final static float TARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。Android堆内存也可自己定义大小对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说 RAM对 性能的影响十分敏感,除了 优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:private final static int CWJ_HEAP_SIZE = 6*
;VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法★android 中用bitmap 时很容易内存溢出,报如下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget● 主要是加上这段:BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 2;● eg1:(通过Uri取图片)private ImageVBitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);preview.setImageBitmap(bitmap);以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。● eg2:(通过路径去图片)private ImageVprivate String fileName= "/sdcard/DCIM/Camera/ 16.01.44.jpg";BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一Bitmap b = BitmapFactory.decodeFile(fileName, options);preview.setImageBitmap(b);filePath.setText(fileName);★Android 还有一些性能优化的方法:● 首先内存方面,可以参考 Android堆内存也可自己定义大小 和 优化Dalvik虚拟机的堆内存分配● 基础类型上,因为Java没有实际的指针,在敏感运算方面还是要借助NDK来完成。Android123提示游戏开发者,这点比较有意思的是 Google 推出NDK可能是帮助游戏开发人员,比如OpenGL ES的支持有明显的改观,本地代码操作图形界面是很必要的。● 图形对象优化,这里要说的是Android上的Bitmap对象销毁,可以借助recycle()方法显示让GC回收一个Bitmap对象,通常对一个不用的Bitmap可以使用下面的方式,如if(bitmapObject.isRecycled()==false) //如果没有回收bitmapObject.recycle();● 目前系统对动画支持比较弱智对于常规应用的补间过渡效果可以,但是对于游戏而言一般的美工可能习惯了GIF方式的统一处理,目前Android系统仅能预览GIF的第一帧,可以借助J2ME中通过线程和自己写解析器的方式来读取GIF89格式的资源。● 对于大多数Android手机没有过多的物理按键可能我们需要想象下了做好手势识别 GestureDetector 和重力感应来实现操控。通常我们还要考虑误操作问题的降噪处理。Android堆内存也可自己定义大小对于一些大型Android项目或游戏来说在算法处理上没有问题外,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对 RAM都 比较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了上次Android开发网提到的优化Dalvik虚拟机的堆内存分配外,我们还可以强制 定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:private final static int CWJ_HEAP_SIZE = 6*
;VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理,我们将在下次提到具体应用。优化Dalvik虚拟机的堆内存分配对于Android平台来说,其托管层使用的Dalvik JavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体 原理我们可以参考开源工程,这里我们仅说下使用方法: private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。模拟器RAM比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况。放入到Bitmap的时候,大小会变大,导致超出RAM内存,具体解决办法如下:Java代码:1. //解决加载图片 内存溢出的问题2. //Options 只保存图片尺寸大小,不保存图片到内存3.4.5. BitmapFactory.Options opts = new BitmapFactory.Options();6.7.8. /缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰 /9.10.11. opts.inSampleSize = 4;12. Bitmap bmp =13. bmp = BitmapFactory.decodeResource(getResources(), mImageIdsposition ,opts);14. ...15. //回收16. bmp.recycle();复制代码还可以用到优化Dalvik虚拟机的堆内存分配对于Android平台来说,其托管层使用的Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法: private final static float TARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);Android堆内存也可自己定义大小对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,除了 优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:Java代码:1. private final static int CWJ_HEAP_SIZE = 6*
;2.3. VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);4. //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理ZONGJIE总结的很全,转来了,来自csdn,baidu,iteye,android123等
jQuery步骤
jQuery方法
//JQueryjQuery 语法实例$(this).hide()
演示 jQuery hide() 函数,隐藏当前的 HTML 元素。$("#test").hide()
演示 jQuery hide() 函数,隐藏 id="test" 的元素。$("p").hide()
演示 jQuery hide() 函数,隐藏所有 &p& 元素。$(".test").hide()
演示 jQuery hide() 函数,隐藏所有 class="test" 的元素。jQuery 语法jQuery 语法是为 HTML 元素的选取编制的,可以对元素执行某些操作。基础语法是:$(selector).action()
* 美元符号定义 jQuery
* 选择符(selector)“查询”和“查找” HTML 元素
* jQuery 的 action() 执行对元素的操作示例$(this).hide() - 隐藏当前元素$("p").hide() - 隐藏所有段落$("p.test").hide() - 隐藏所有 class="test" 的段落$("#test").hide() - 隐藏所有 id="test" 的元素提示:jQuery 使用的语法是 XPath 与 CSS 选择器语法的组合。在本教程接下来的章节,您将学习到更多有关选择器的语法。文档就绪函数您也许已经注意到在我们的实例中的所有 jQuery 函数位于一个 document ready 函数中:$(document).ready(function(){--- jQuery functions go here ----});这是为了防止文档在完全加载(就绪)之前运行 jQuery 代码。如果在文档没有完全加载之前就运行函数,操作可能失败。//jQuery 选择器在前面的章节中,我们展示了一些有关如何选取 HTML 元素的实例。关键点是学习 jQuery 选择器是如何准确地选取您希望应用效果的元素。jQuery 元素选择器和属性选择器允许您通过标签名、属性名或内容对 HTML 元素进行选择。选择器允许您对 HTML 元素组或单个元素进行操作。在 HTML DOM 术语中:选择器允许您对 DOM 元素组或单个 DOM 节点进行操作。jQuery 元素选择器jQuery 使用 CSS 选择器来选取 HTML 元素。$("p") 选取 &p& 元素。$("p.intro") 选取所有 class="intro" 的 &p& 元素。$("p#demo") 选取 id="demo" 的第一个 &p& 元素。jQuery 属性选择器jQuery 使用 XPath 表达式来选择带有给定属性的元素。$("[href]") 选取所有带有 href 属性的元素。$("[href='#']") 选取所有带有 href 值等于 "#" 的元素。$("[href!='#']") 选取所有带有 href 值不等于 "#" 的元素。$("[href$='.jpg']") 选取所有 href 值以 ".jpg" 结尾的元素。jQuery CSS 选择器jQuery CSS 选择器可用于改变 HTML 元素的 CSS 属性。下面的例子把所有 p 元素的背景颜色更改为红色:实例$("p").css("background-color","red");//jQuery 选择器选择器
所有元素#id
$("#lastname")
id="lastname" 的元素.class
$(".intro")
所有 class="intro" 的元素element
所有 &p& 元素.class.class
$(".intro.demo")
所有 class="intro" 且 class="demo" 的元素
$("p:first")
第一个 &p& 元素:last
$("p:last")
最后一个 &p& 元素:even
$("tr:even")
所有偶数 &tr& 元素:odd
$("tr:odd")
所有奇数 &tr& 元素
:eq(index)
$("ul li:eq(3)")
列表中的第四个元素(index 从 0 开始):gt(no)
$("ul li:gt(3)")
列出 index 大于 3 的元素:lt(no)
$("ul li:lt(3)")
列出 index 小于 3 的元素:not(selector)
$("input:not(:empty)")
所有不为空的 input 元素
$(":header")
所有标题元素 &h1& - &h6&:animated
所有动画元素
:contains(text)
$(":contains('W3School')")
包含指定字符串的所有元素:empty
$(":empty")
无子(元素)节点的所有元素:hidden
$("p:hidden")
所有隐藏的 &p& 元素:visible
$("table:visible")
所有可见的表格
$("th,td,.intro")
所有带有匹配选择的元素
[attribute]
$("[href]")
所有带有 href 属性的元素[attribute=value]
$("[href='#']")
所有 href 属性的值等于 "#" 的元素[attribute!=value]
$("[href!='#']")
所有 href 属性的值不等于 "#" 的元素[attribute$=value]
$("[href$='.jpg']")
所有 href 属性的值包含 ".jpg" 的元素
$(":input")
所有 &input& 元素:text
$(":text")
所有 type="text" 的 &input& 元素:password
$(":password")
所有 type="password" 的 &input& 元素:radio
$(":radio")
所有 type="radio" 的 &input& 元素:checkbox
$(":checkbox")
所有 type="checkbox" 的 &input& 元素:submit
$(":submit")
所有 type="submit" 的 &input& 元素:reset
$(":reset")
所有 type="reset" 的 &input& 元素:button
$(":button")
所有 type="button" 的 &input& 元素:image
$(":image")
所有 type="image" 的 &input& 元素:file
$(":file")
所有 type="file" 的 &input& 元素
$(":enabled")
所有激活的 input 元素:disabled
$(":disabled")
所有禁用的 input 元素:selected
$(":selected")
所有被选取的 input 元素:checked
$(":checked")
所有被选中的 input 元素//jQuery 事件方法事件方法会触发匹配元素的事件,或将函数绑定到所有匹配元素的某个事件。触发实例:$("button#demo").click()上面的例子将触发 id="demo" 的 button 元素的 click 事件。绑定实例:$("button#demo").click(function(){$("img").hide()})上面的例子会在点击 id="demo" 的按钮时隐藏所有图像。方法
描述bind()
向匹配元素附加一个或更多事件处理器blur()
触发、或将函数绑定到指定元素的 blur 事件change()
触发、或将函数绑定到指定元素的 change 事件click()
触发、或将函数绑定到指定元素的 click 事件dblclick()
触发、或将函数绑定到指定元素的 double click 事件delegate()
向匹配元素的当前或未来的子元素附加一个或多个事件处理器die()
移除所有通过 live() 函数添加的事件处理程序。error()
触发、或将函数绑定到指定元素的 error 事件event.isDefaultPrevented()
返回 event 对象上是否调用了 event.preventDefault()。event.pageX
相对于文档左边缘的鼠标位置。event.pageY
相对于文档上边缘的鼠标位置。event.preventDefault()
阻止事件的默认动作。event.result
包含由被指定事件触发的事件处理器返回的最后一个值。event.target
触发事件的 DOM 元素。event.timeStamp
该属性返回从 1970 年 1 月 1 日到事件发生时的毫秒数。event.type
描述事件的类型。event.which
指示按了哪个键或按钮。focus()
触发、或将函数绑定到指定元素的 focus 事件keydown()
触发、或将函数绑定到指定元素的 key down 事件keypress()
触发、或将函数绑定到指定元素的 key press 事件keyup()
触发、或将函数绑定到指定元素的 key up 事件live()
触发、或将函数绑定到指定元素的 load 事件load()
触发、或将函数绑定到指定元素的 load 事件mousedown()
触发、或将函数绑定到指定元素的 mouse down 事件mouseenter()
触发、或将函数绑定到指定元素的 mouse enter 事件mouseleave()
触发、或将函数绑定到指定元素的 mouse leave 事件mousemove()
触发、或将函数绑定到指定元素的 mouse move 事件mouseout()
触发、或将函数绑定到指定元素的 mouse out 事件mouseover()
触发、或将函数绑定到指定元素的 mouse over 事件mouseup()
触发、或将函数绑定到指定元素的 mouse up 事件one()
向匹配元素添加事件处理器。每个元素只能触发一次该处理器。ready()
文档就绪事件(当 HTML 文档就绪可用时)resize()
触发、或将函数绑定到指定元素的 resize 事件scroll()
触发、或将函数绑定到指定元素的 scroll 事件select()
触发、或将函数绑定到指定元素的 select 事件submit()
触发、或将函数绑定到指定元素的 submit 事件toggle()
绑定两个或多个事件处理器函数,当发生轮流的 click 事件时执行。trigger()
所有匹配元素的指定事件triggerHandler()
第一个被匹配元素的指定事件unbind()
从匹配元素移除一个被添加的事件处理器undelegate()
从匹配元素移除一个被添加的事件处理器,现在或将来unload()
触发、或将函数绑定到指定元素的 unload 事件//jQuery 隐藏和显示通过 hide() 和 show() 两个函数,jQuery 支持对 HTML 元素的隐藏和显示:实例$("#hide").click(function(){$("p").hide();});$("#show").click(function(){$("p").show();});hide() 和 show() 都可以设置两个可选参数:speed 和 callback。语法:$(selector).hide(speed,callback)$(selector).show(speed,callback)speed 参数规定显示或隐藏的速度。可以设置这些值:"slow", "fast", "normal" 或毫秒。callback 参数是在 hide 或 show 函数完成之后被执行的函数名称。您将在本教程下面的章节学习更多有关 callback 参数的知识。实例$("button").click(function(){$("p").hide(1000);});//jQuery 切换jQuery toggle() 函数使用 show() 或 hide() 函数来切换 HTML 元素的可见状态。隐藏显示的元素,显示隐藏的元素。语法:$(selector).toggle(speed,callback)speed 参数可以设置这些值:"slow", "fast", "normal" 或 毫秒。实例$("button").click(function(){$("p").toggle();});callback 参数是在该函数完成之后被执行的函数名称。您将在本教程下面的章节学习更多有关 callback 参数的知识。//jQuery 滑动函数 - slideDown, slideUp, slideTogglejQuery 拥有以下滑动函数:$(selector).slideDown(speed,callback)$(selector).slideUp(speed,callback)$(selector).slideToggle(speed,callback)speed 参数可以设置这些值:"slow", "fast", "normal" 或毫秒。callback 参数是在该函数完成之后被执行的函数名称。您将在本教程下面的章节学习更多有关 callback 参数的知识。//slideDown() 实例$(".flip").click(function(){$(".panel").slideDown();});//slideUp() 实例$(".flip").click(function(){$(".panel").slideUp()})//slideToggle() 实例$(".flip").click(function(){$(".panel").slideToggle();});//jQuery Fade 函数 - fadeIn(), fadeOut(), fadeTo()jQuery 拥有以下 fade 函数:$(selector).fadeIn(speed,callback)$(selector).fadeOut(speed,callback)$(selector).fadeTo(speed,opacity,callback)speed 参数可以设置这些值:"slow", "fast", "normal" 或 毫秒。fadeTo() 函数中的 opacity 参数规定减弱到给定的不透明度。callback 参数是在该函数完成之后被执行的函数名称。您将在本教程下面的章节学习更多有关 callback 参数的知识。//fadeTo() 实例$("button").click(function(){$("div").fadeTo("slow",0.25);});//fadeOut() 实例$("button").click(function(){$("div").fadeOut(4000);});//jQuery 自定义动画jQuery 函数创建自定义动画的语法:$(selector).animate({params},[duration],[easing],[callback])关键的参数是 params。它定义产生动画的 CSS 属性。可以同时设置多个此类属性:animate({width:"70%",opacity:0.4,marginLeft:"0.6in",fontSize:"3em"});第二个参数是 duration。它定义用来应用到动画的时间。它设置的值是:"slow", "fast", "normal" 或毫秒。实例 1&script type="text/javascript"&$(document).ready(function(){$("#start").click(function(){$("#box").animate({height:300},"slow");$("#box").animate({width:300},"slow");$("#box").animate({height:100},"slow");$("#box").animate({width:100},"slow");});});&/script& 亲自试一试实例 2&script type="text/javascript"&$(document).ready(function(){$("#start").click(function(){$("#box").animate({left:"100px"},"slow");$("#box").animate({fontSize:"3em"},"slow");});});&/script& 亲自试一试HTML 元素默认是静态定位,且无法移动。如需使元素可以移动,请把 CSS 的 position 设置为 relative 或 absolute。jQuery 效果 - 来自本页函数
描述$(selector).hide()
隐藏被选元素$(selector).show()
显示被选元素$(selector).toggle()
切换(在隐藏与显示之间)被选元素$(selector).slideDown()
向下滑动(显示)被选元素$(selector).slideUp()
向上滑动(隐藏)被选元素$(selector).slideToggle()
对被选元素切换向上滑动和向下滑动$(selector).fadeIn()
淡入被选元素$(selector).fadeOut()
淡出被选元素$(selector).fadeTo()
把被选元素淡出为给定的不透明度$(selector).animate()
对被选元素执行自定义动画//jQuery 效果函数方法
描述animate()
对被选元素应用“自定义”的动画clearQueue()
对被选元素移除所有排队的函数(仍未运行的)delay()
对被选元素的所有排队函数(仍未运行)设置延迟dequeue()
运行被选元素的下一个排队函数fadeIn()
淡入被选元素至完全不透明fadeOut()
淡出被选元素至完全不透明fadeTo()
把被选元素减弱至给定的不透明度hide()
隐藏被选的元素queue()
显示被选元素的排队函数show()
显示被选的元素slideDown()
通过调整高度来滑动显示被选元素slideToggle()
对被选元素进行滑动隐藏和滑动显示的切换slideUp()
通过调整高度来滑动隐藏被选元素stop()
停止在被选元素上运行动画toggle()
对被选元素进行隐藏和显示的切换//jQuery 文档操作方法这些方法对于 XML 文档和 HTML 文档均是适用的,除了:html()。方法
描述addClass()
向匹配的元素添加指定的类名。after()
在匹配的元素之后插入内容。append()
向匹配的元素内部追加内容。appendTo()
向匹配的元素内部追加内容。attr()
设置或返回匹配元素的属性和值。before()
在每个匹配的元素之前插入内容。clone()
创建匹配元素集合的副本。detach()
从 DOM 中移除匹配元素集合。empty()
删除匹配的元素集合中所有的子节点。hasClass()
检查匹配的元素是否拥有指定的类。html()
设置或返回匹配的元素集合中的 HTML 内容。insertAfter()
把匹配的元素插入到另一个指定的元素集合的后面。insertBefore()
把匹配的元素插入到另一个指定的元素集合的前面。prepend()
向每个匹配的元素内部前置内容。prependTo()
向每个匹配的元素内部前置内容。remove()
移除所有匹配的元素。removeAttr()
从所有匹配的元素中移除指定的属性。removeClass()
从所有匹配的元素中删除全部或者指定的类。replaceAll()
用匹配的元素替换所有匹配到的元素。replaceWith()
用新内容替换匹配的元素。text()
设置或返回匹配元素的内容。toggleClass()
从匹配的元素中添加或删除一个类。unwrap()
移除并替换指定元素的父元素。val()
设置或返回匹配元素的值。wrap()
把匹配的元素用指定的内容或元素包裹起来。wrapAll()
把所有匹配的元素用指定的内容或元素包裹起来。wrapinner()
将每一个匹配的元素的子内容用指定的内容或元素包裹起来。//jQuery 属性操作方法下面列出的这些方法获得或设置元素的 DOM 属性。这些方法对于 XML 文档和 HTML 文档均是适用的,除了:html()。方法
描述addClass()
向匹配的元素添加指定的类名。attr()
设置或返回匹配元素的属性和值。hasClass()
检查匹配的元素是否拥有指定的类。html()
设置或返回匹配的元素集合中的 HTML 内容。removeAttr()
从所有匹配的元素中移除指定的属性。removeClass()
从所有匹配的元素中删除全部或者指定的类。toggleClass()
从匹配的元素中添加或删除一个类。val()
设置或返回匹配元素的值。//jQuery CSS 操作函数下面列出的这些方法设置或返回元素的 CSS 相关属性。CSS 属性
设置或返回匹配元素的样式属性。height()
设置或返回匹配元素的高度。offset()
返回第一个匹配元素相对于文档的位置。offsetParent()
返回最近的定位祖先元素。position()
返回第一个匹配元素相对于父元素的位置。scrollLeft()
设置或返回匹配元素相对滚动条顶部的偏移。scrollTop()
设置或返回匹配元素相对滚动条左侧的偏移。width()
设置或返回匹配元素的宽度。//jQuery Ajax 操作函数jQuery 库拥有完整的 Ajax 兼容套件。其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据。函数
描述jQuery.ajax()
执行异步 HTTP (Ajax) 请求。.ajaxComplete()
当 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。.ajaxError()
当 Ajax 请求完成且出现错误时注册要调用的处理程序。这是一个 Ajax 事件。.ajaxSend()
在 Ajax 请求发送之前显示一条消息。jQuery.ajaxSetup()
设置将来的 Ajax 请求的默认值。.ajaxStart()
当首个 Ajax 请求完成开始时注册要调用的处理程序。这是一个 Ajax 事件。.ajaxStop()
当所有 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。.ajaxSuccess()
当 Ajax 请求成功完成时显示一条消息。jQuery.get()
使用 HTTP GET 请求从服务器加载数据。jQuery.getJSON()
使用 HTTP GET 请求从服务器加载 JSON 编码数据。jQuery.getScript()
使用 HTTP GET 请求从服务器加载 JavaScript 文件,然后执行该文件。.load()
从服务器加载数据,然后把返回到 HTML 放入匹配元素。jQuery.param()
创建数组或对象的序列化表示,适合在 URL 查询字符串或 Ajax 请求中使用。jQuery.post()
使用 HTTP POST 请求从服务器加载数据。.serialize()
将表单内容序列化为字符串。.serializeArray()
序列化表单元素,返回 JSON 数据结构数据。//jQuery 遍历函数jQuery 遍历函数包括了用于筛选、查找和串联元素的方法。函数
描述.add()
将元素添加到匹配元素的集合中。.andSelf()
把堆栈中之前的元素集添加到当前集合中。.children()
获得匹配元素集合中每个元素的所有子元素。.closest()
从元素本身开始,逐级向上级元素匹配,并返回最先匹配的祖先元素。.contents()
获得匹配元素集合中每个元素的子元素,包括文本和注释节点。.each()
对 jQuery 对象进行迭代,为每个匹配元素执行函数。.end()
结束当前链中最近的一次筛选操作,并将匹配元素集合返回到前一次的状态。.eq()
将匹配元素集合缩减为位于指定索引的新元素。.filter()
将匹配元素集合缩减为匹配选择器或匹配函数返回值的新元素。.find()
获得当前匹配元素集合中每个元素的后代,由选择器进行筛选。.first()
将匹配元素集合缩减为集合中的第一个元素。.has()
将匹配元素集合缩减为包含特定元素的后代的集合。.is()
根据选择器检查当前的匹配元素集合,如果存在至少一个匹配元素,则返回 true。.last()
将匹配元素集合缩减为集合中的最后一个元素。.map()
把当前匹配集合中的每个元素传递给一个函数,产生包含返回值的新的 jQuery 对象。.next()
获得匹配元素集合中每个元素紧邻的同辈元素。.nextAll()
获得匹配元素集合中每个元素之后的所有同辈元素,由选择器进行筛选(可选)。.nextUntil()
获得每个元素之后所有的同辈元素,直到遇到匹配选择器的元素为止。.not()
从匹配元素集合中删除元素。.offsetParent()
获得用于定位的第一个父元素。.parent()
获得当前匹配元素集合中每个元素的父元素,由选择器筛选(可选)。.parentsUntil()
获得当前匹配元素集合中每个元素的祖先元素,直到遇到匹配选择器的元素为止。.prev()
获得匹配元素集合中每个元素紧邻的前一个同辈元素,由选择器筛选(可选)。.prevAll()
获得匹配元素集合中每个元素之前的所有同辈元素,由选择器进行筛选(可选)。.prevUntil()
获得每个元素之前所有的同辈元素,直到遇到匹配选择器的元素为止。.siblings()
获得匹配元素集合中所有元素的同辈元素,由选择器筛选(可选)。.slice()
将匹配元素集合缩减为指定范围的子集。//jQuery 数据存储函数这些方法允许我们将指定的 DOM 元素与任意数据相关联。函数
描述.data()
存储与匹配元素相关的任意数据。jQuery.data()
存储与指定元素相关的任意数据。.removeData()
移除之前存放的数据。jQuery.removeData()
移除之前存放的数据。//jQuery 队列控制函数函数
描述.clearQueue()
从队列中删除所有未运行的项目。.dequeue()
从队列最前端移除一个队列函数,并执行它。jQuery.dequeue()
从队列最前端移除一个队列函数,并执行它。.queue()
显示或操作匹配元素所执行函数的队列。jQuery.queue()
显示或操作匹配元素所执行函数的队列。//jQuery 核心函数函数
描述jQuery()
接受一个字符串,其中包含了用于匹配元素集合的 CSS 选择器。jQuery.noConflict()
运行这个函数将变量 $ 的控制权让渡给第一个实现它的那个库。
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 android内存优化 汇总 的文章

 

随机推荐