闲着无聊,最近需要用手机测试一些安卓项目时发现居然没有wifi。上网找了些资源,整理了如下,以更网友们参考:
1、你可以开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网。
2、点开始----所有程序-----命令提示符右键管理员身份运行命令提示符----运行命令:
netsh wlan set hostednetwork mode=allow ssid=wuminPC key=wuminWiFi
此命令有三个参数:
mode:是否启用虚拟WiFi网卡,改为disallow则为禁用 。
ssid:无线网名称,最好用英文(以wuminPC为例)。
key:无线网密码,八个以上字符(以wuminWiFi为例)。
以上三个参数可以自己设置,例如只使用mode=disallow可以直接禁用虚拟Wifi网卡。
3、开启成功后,网络连接中会多出一个网卡为“Microsoft Virtual WiFi Miniport Adapter”的无线连接2,为方便起见,将其重命名为虚拟WiFi。
4、有些win7可能找不到网络连接,在 控制面板\网络和 Internet\网络和共享中心 点左边的更改适配器设置就是网络连接。
在“网络连接”窗口中,右键单击已连接到Internet的网络连接,选择“属性”→“共享”,勾上“允许其他······连接(N)”并选择“虚拟WiFi”。确定之后,提供共享的网卡图标旁会出现“共享的”字样,表示“宽带连接”已共享至“虚拟WiFi”。
5、继续在命令提示符中运行:netsh wlan start hostednetwork
(将start改为stop即可关闭该无线网,以后开机后要启用该无线网只需再次运行此命令即可)
6、至此,虚拟WiFi的红叉叉消失,WiFi基站已组建好,主机设置完毕。笔记本、带WiFi模块的手机等子机搜索到无线网络wuminPC,输入密码wuminWiFi,就能共享上网啦!
========================================================================
netsh wlan set hostednetwork mode=allow ssid=visible key=20121125
netsh wlan start hostednetwork
netsh wlan stop hostednetwork
从上一节:【1.4】系统漫游——系统硬件结构以及程序执行过程 中可以看到,hello执行过程中,代码和数据由硬盘copy到内存中,再由内存copy到寄存器中,最后由寄存器copy到显存中。为完成这么一个简单的数据显示动作,竟然需要对”倒腾“这么多次数据,而且根据”木桶理论“,系统的执行效率由最慢的设备决定,有必要对这个过程进行优化一下了。题外话:依稀记得好像有人说过”程序员的工作就是搬数“,计算机的工作又何尝不是搬数呢,把数据从一个地方搬过来,进行处理后再搬到另一个地方,仅此而已!
1、高速缓存的产生
根据机械原理,容量大的设备运行速度要慢于容量小的设备,速度快的设备要贵于速度慢的设备。同理,寄存器文件能存储几百个字节,而内存能存储几百万字节,而寄存器的操作速度要几百倍的快于内存的操作。这就造成了处理器和内存之间的速度鸿沟,更郁闷的是,处理器的技术进步速度(可以搜索inter的Tick-Tock策略)要远远快于内存技术的进步,现在的处理器22nm的制程,4核甚至8核的出现,而内存技术才发展到DDR3(1333MHZ-1600MHZ)。始终使系统处于这样一种状态:cpu一直处于饥饿状态,内存一直处于忙碌状态。需要做出一些改变了……
如何改变?那就是在处理器和内存之间,增加一个临时存储空间叫做高速缓存cache。cache的容量介于处理器和内存之间,速度也介于两者之间,主要保存一些处理器当前和未来“最需要”的数据。系统结构如下图所示:
示例图中出现了两种缓存1级缓存L1和2级缓存L2,他们都是SRAM结构而内存是DRAM结构(关于它们的区别,可以自行搜索)。为什么出现了两个级别cache呢?就像刚才讨论的那样,增加了一级cache还是感觉速度瓶颈,所以就再增加一级,不行就再增加一级,所以现在看到的cpu,基本上都是3个级别cache。L1-L2-L3-主存,它们的速度依次降低,容量依次增加,成本依次降低。这里提一点:既然知道了缓存的重要性,那么在bios设置中千万不要关掉缓存,否则那速度你懂得!还有人说过“看cpu性能高低,除了看频率还要看缓存大小”,这句话是片面的,如果对于同一厂商的cpu基本正确,但是千万不要拿这两个指标来对比inter和AMD的cpu,因为他们的缓存设计策略不同,缓存大小没有可比性。
缓存的原理:缓存可以提高执行效率,是利用了程序的局部性原理,包括时间局部性和空间局部性。因为多数时候代码执行是有规律的,它们之间呈现局部聚集特性,就是说某个地址addr的代码在执行后,下一个要执行的代码地址多数时候就在addr附近,这时候系统cpu完全可以自作主张的事先把addr附近的代码放入cache中供ALU使用。既然是事先,那么就有命中率的问题,现代cpu命中率基本可以达到80%甚至更高。所以,就对我们程序员提出了更高的要求,如果想提高效率,那么编写的程序就尽量符合局部性原理。
2、金字塔型存储设备
经过实践验证,在cpu和memory之间增加cache,能大幅度提高系统效率,但我们并不满足于此,还要进一步完善“缓存”策略挖掘系统潜能,最终做成“金字塔型”存储方案。现代计算机基本都属于这样一个存储模型,如下图所示:
该模型的主要思想是:某一层的存储空间是它下一层空间的缓存,从上到下速度越来越慢,空间越来越大。例如:寄存器是L1的缓存,内存是硬盘的缓存,本地硬盘式网络硬盘的缓存。重点讲一下最后两层,我们上网浏览网页听音乐,都会在本地磁盘上产生大量的临时文件并保存浏览记录,这些文件都可以认为是网络服务器中的文件的“缓存”,这样当我们点“后退”按钮,或者重新打开某个网页时,就会直接从本地磁盘调用文件,而不是从网络下载。还有当处理网络异常时,有的人喜欢打开浏览器,一看到“百度”的页面就说网络修好了,其实有可能那是假象,你打开的很可能是自己磁盘的页面,所以如果想验证网络好坏,最好打开一个你平时不打开的页面,这样在本次磁盘没有缓存,系统会直接从网络索取,如果网络畅通就能打开,如果不畅则会404。
注意:“金字塔型”存储结构的核心是“缓冲”,一定要结合生活实践理解缓冲的概念,学习“缓冲”的思想。
看了ListView的下拉刷新,原理是动态调整 Listview的第一行的paddingTop值,然后就能实现ListView的下拉刷新。
有下面几个ListView常用的方法
getFirstVisiblePosition() 取得界面上第一个显示的位置
getLastVisiblePosition() 取得界面上最后一个显示的位置
setSelection(int position) 设置当前选中的位置,List会自动调至该位置
sdetVerticalScrollBarEnable(true) 设置scrollbar不能往下拉
getMeasuredHeight() 达到测量的长度,要在下面的measureView调用之后再调用,不然得到的是0
getBottom() 得得到view的最下面在屏幕中的位置
getPaddingTop()
还有两个方法也不错,测量view的高度
private void measureView(View child) { ViewGroup.LayoutParams p = child.getLayoutParams(); if (p == null) { p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width); int lpHeight = p.height; int childHeightSpec; if (lpHeight > 0) { childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); } else { childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); } Log.d(TAG, "childWidthSpec:" + childWidthSpec + " childHeightSpec:" + childHeightSpec); child.measure(childWidthSpec, childHeightSpec); }
在OnTouchEvent 的Move事件中计算出当下移动的位置
private void refreshHead(MotionEvent e){ int point = e.getHistorySize(); for(int i = 0; i < point; i ++){ int historicalY = (int) e.getHistoricalY(i); int topPadding = (int)((historicalY - mLastPositionY - mRefreshViewHeight) / 1.7); mRefreshView.setPadding(mRefreshView.getPaddingLeft(), topPadding, mRefreshView.getPaddingRight(), mRefreshView.getPaddingBottom()); if(getFirstVisiblePosition() == 0){ if(mRefreshView.getBottom() > 50){ mListState = PULL_READ_REFRESH; displayRefreshView(); } else { mListState = PULL_REFRESH; } } } }