当前位置: 编程技术>移动开发
本页文章导读:
▪DDMS查看Threads景况 DDMS查看Threads情况
DDMS查看Threads情况原文地址:http://www.cnblogs.com/flyme/archive/2011/08/26/2154270.html 有时候程序运行出现死锁或者信号量卡死是很纠结的问题,单看代码很难分析定位问题.........
▪ 什么是JIT 什么是JIT?
什么是JIT?
JIT是just in time,即时编译技术。使用该技术,能够加速java程序的执行速度。下面,就对该技术做个简单的讲解。
首先,我们大家都知道,通常j.........
▪ 替launcher添加一个仿Mac的dock(附源码) 为launcher添加一个仿Mac的dock(附源码)
之前在网上看到有篇文章:Launcher之Dock细节篇http://news.wangmeng.cn/detailNews/2716-the-article-details-launcher-dock 它实现了一个仿Mac的dock。感觉蛮有意思的,所以.........
[1]DDMS查看Threads景况
来源: 互联网 发布时间: 2014-02-18
DDMS查看Threads情况
DDMS查看Threads情况
原文地址:http://www.cnblogs.com/flyme/archive/2011/08/26/2154270.html
有时候程序运行出现死锁或者信号量卡死是很纠结的问题,单看代码很难分析定位问题,这时候可以借助DDMS来查看threads的运行情况,一目了然。
手机连接上USB,确保adb连通,然后启动Eclipse里的DDMS,这时候应该手机就正常连接上了
就如上图中显示的,只要连接上了就可以查看某个进程里的所有线程的活动了; 下面具体解释下Threads标签页里给出的每个字段的意思:
ID: 虚拟机分配的唯一的线程ID,在Dalvik里,它们是从3开始的奇数。
Tid:linux的线程ID号
Stauts:线程状态,比较多,有下面的一些
running: 正在执行程序代码
sleeping:执行了Thread.sleep()
monitor:等待接受一个监听锁。
wait::Object.wait(),等待被其他线程唤醒
native:正在执行native代码,
vmwait:等待虚拟机,(这个不是很懂,高手指教,这个状态在什么情况下发生)
zombie:线程在垂死的进程
init:线程在初始化(我们不可能看到)
starting:线程正在启动(我们不可能看到)
utime:执行用户代码的累计时间
stime:执行系统代码的累计时间
name:线程的名字
另外,右侧每个Thread选中之后可以在下面看到Refresh按钮,这个点了之后,可以看到线程的函数执行,结合Status可以知道目前情况;而出现问题时某个线程一般会变为monitor状态,这时候就要特别留意他,并refresh下,检查他的执行情况 ,再回头结合代码,一般都能找到问题出在什么地方;
【PS】,该文比较适合容易重现的问题;
DDMS查看Threads情况
原文地址:http://www.cnblogs.com/flyme/archive/2011/08/26/2154270.html
有时候程序运行出现死锁或者信号量卡死是很纠结的问题,单看代码很难分析定位问题,这时候可以借助DDMS来查看threads的运行情况,一目了然。
手机连接上USB,确保adb连通,然后启动Eclipse里的DDMS,这时候应该手机就正常连接上了
就如上图中显示的,只要连接上了就可以查看某个进程里的所有线程的活动了; 下面具体解释下Threads标签页里给出的每个字段的意思:
ID: 虚拟机分配的唯一的线程ID,在Dalvik里,它们是从3开始的奇数。
Tid:linux的线程ID号
Stauts:线程状态,比较多,有下面的一些
running: 正在执行程序代码
sleeping:执行了Thread.sleep()
monitor:等待接受一个监听锁。
wait::Object.wait(),等待被其他线程唤醒
native:正在执行native代码,
vmwait:等待虚拟机,(这个不是很懂,高手指教,这个状态在什么情况下发生)
zombie:线程在垂死的进程
init:线程在初始化(我们不可能看到)
starting:线程正在启动(我们不可能看到)
utime:执行用户代码的累计时间
stime:执行系统代码的累计时间
name:线程的名字
另外,右侧每个Thread选中之后可以在下面看到Refresh按钮,这个点了之后,可以看到线程的函数执行,结合Status可以知道目前情况;而出现问题时某个线程一般会变为monitor状态,这时候就要特别留意他,并refresh下,检查他的执行情况 ,再回头结合代码,一般都能找到问题出在什么地方;
【PS】,该文比较适合容易重现的问题;
[2] 什么是JIT
来源: 互联网 发布时间: 2014-02-18
什么是JIT?
什么是JIT?
JIT是just in time,即时编译技术。使用该技术,能够加速java程序的执行速度。下面,就对该技术做个简单的讲解。
首先,我们大家都知道,通常javac将程序源代码编译,转换成java字节码,JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢。为了提高执行速度,引入了JIT技术。
在运行时JIT会把翻译过的机器码保存起来,已备下次使用,因此从理论上来说,采用该JIT技术可以,可以接近以前纯编译技术。下面我看看,JIT的工作过程。
JIT 编译过程
当JIT编译启用时(默认是启用的),JVM读入.class文件解释后,将其发给JIT编译器。JIT编译器将字节码编译成本机机器代码,下图展示了该过程。
通过上面的解释,我们了解了JIT的工作原理及过程,同样也发现了个问题,由于JIT对每条字节码都进行编译,造成了编译过程负担过重。为了避免这种情况,当前的JIT只对经常执行的字节码进行编译,如循环等。
需要说明的是,JIT并不总是奏效,不能期望JIT一定能够加速你代码执行的速度,更糟糕的是她有可能降低代码的执行速度。这取决于你的代码结构,当然很多情况下我们还是能够如愿以偿的。
[3] 替launcher添加一个仿Mac的dock(附源码)
来源: 互联网 发布时间: 2014-02-18
为launcher添加一个仿Mac的dock(附源码)
之前在网上看到有篇文章:Launcher之Dock细节篇http://news.wangmeng.cn/detailNews/2716-the-article-details-launcher-dock 它实现了一个仿Mac的dock。感觉蛮有意思的,所以就照着仿制了一个。
可以动态的添加快捷方式,默认包含AllApp按钮,图标居中显示。
文章后边附带的源码是基于android2.2自带的launcher2稍作修改而成,使用eclipse调试。
一、首先要在Launcher的setupViews函数里面初始化自己的layout(需增加3个地方)
[java] view plaincopy
1.
dockbar=(DockBar)dragLayer.findViewById(R.id.dockbar);
dockbar.setLauncher(this);
dockbar.setDragController(dragController);
2.
dragController.setDragScoller(workspace);
dragController.setDragListener(deleteZone);
dragController.setDockDragListener(dockbar); // hmg25 add for dock
setDockDragListener为自定义函数,添加在DragController的startDrag中,具体见源码
if(mDockListener!=null){
mDockListener.onDragStart(source, dragInfo, dragAction);
}
3.
// The order here is bottom to top.
dragController.addDropTarget(workspace);
dragController.addDropTarget(dockbar); //hmg25 add for dock
dragController.addDropTarget(deleteZone);
二、在layout-port的launcher.xml中增加
[xhtml] view plaincopy
<!--hmg add for dock { -->
<com.android.launcher2.DockBar
android:id="@+id/dockbar"
android:layout_width="fill_parent"
android:layout_height="@dimen/button_bar_height"
android:layout_gravity="bottom|center_horizontal"
android:background="@drawable/dock_bg"
launcher:direction="horizontal">
<HorizontalScrollView android:id="@+id/dock_scroll_view"
android:scrollbars="none"
android:fadingEdge="none"
android:saveEnabled="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:orientation="horizontal"
android:id="@+id/dock_item_holder"
android:saveEnabled="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.android.launcher2.HandleView //默认将allapp按钮添加进去
android:id="@+id/all_apps_button"
android:layout_centerHorizontal="true"
android:src="/blog_article/@drawable/all_apps_button/index.html"
launcher:direction="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
android:clickable="true"
/>
</LinearLayout>
</HorizontalScrollView>
</com.android.launcher2.DockBar>
<!--hmg add for dock } -->
三、创建自定义的类:
[java] view plaincopy
public class DockBar extends LinearLayout implements DropTarget, DragSource,
DragController.DragListener,View.OnLongClickListener {
@Override
public boolean acceptDrop(DragSource source, int x, int y, int xOffset,int yOffset,DragView dragView, Object dragInfo) {
//接受什么类型的图标
Log.i("hmg", "DockBar->acceptDrop");
final ItemInfo item = (ItemInfo) dragInfo;
if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_PHOTO_FRAME
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_CLOCK) {
return false;
}
return true;
}
//拖拽释放时响应下边函数
@Override
public void onDrop(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
int position=0;
position=getLocation(x); //根据释放时的坐标,获取插入位置
addItemAt((ItemInfo)dragInfo, position);
}
/*
* 传入x坐标,判断新图标的位置,此处仅判断竖屏
*/
public int getLocation(int x){
for(int i=0;i<mItemHolder.getChildCount();i++){
View iv = mItemHolder.getChildAt(i);
int[] position = new int[2];
//获取坐标,如果要适应横屏可以稍作修改,比较Y值
iv.getLocationOnScreen(position);
//判断释放时新增的图标在原图标的之前还是之后
if(x<=(position[0]+(iv.getWidth()/2))){
return i;
}
}
return mItemHolder.getChildCount();
}
private void addItemAt(ItemInfo itemInfo, int position)
{
View view=null;
switch (itemInfo.itemType) {
case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
ShortcutInfo shortcutInfo;
// 拖拽图标来自于app list
if(itemInfo.container ==NO_ID&& itemInfo instanceof ApplicationInfo)
{
//与来自桌面的图标包含信息不一样,具体看源码
shortcutInfo= new ShortcutInfo((ApplicationInfo)itemInfo);
}
else
shortcutInfo = (ShortcutInfo)itemInfo; //拖拽图标来自桌面
//调用Launcher中的CreateDockShortcut生成一个imageView
view = mLauncher. CreateDockShortcut (shortcutInfo);
view.setOnLongClickListener(this);
break;
case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
break;
default:
throw new IllegalStateException("Unknown item type: "
+ itemInfo.itemType);
}
mItemHolder.addView(view, position);
}
之所以将新建view用Launcher. CreateDockShortcut是想直接使用Launcher中的单击事件。
View CreateDockShortcut (ShortcutInfo shortcutInfo)
{
Context context=getApplicationContext();
ImageView imageView =new ImageView(context);
imageView.setImageBitmap(shortcutInfo.mIcon);
imageView.setOnClickListener(this);
imageView.setFocusable(true);
imageView.setTag(shortcutInfo);
imageView.setMinimumWidth(100);
return imageView;
}
在dock上长按,拖拽交换位置或者拖拽出去
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
if (mLauncher.isAllAppsVisible())
mLauncher.closeAllApps(false);
mSelectedView = v;
//开始拖拽
mDragController.startDrag(v, this, v.getTag(),
DragController.DRAG_ACTION_MOVE);
removeSelectedItem();
return true;
}
private void removeSelectedItem()
{
if (mSelectedView == null)
return;
mItemHolder.removeView(mSelectedView);
}
代码修改了不少地方,具体看代码,修改的地方我都标注啦 ~~欢迎大家指教,相互交流~~
源码地址:http://download.csdn.net/source/3142047
之前在网上看到有篇文章:Launcher之Dock细节篇http://news.wangmeng.cn/detailNews/2716-the-article-details-launcher-dock 它实现了一个仿Mac的dock。感觉蛮有意思的,所以就照着仿制了一个。
可以动态的添加快捷方式,默认包含AllApp按钮,图标居中显示。
文章后边附带的源码是基于android2.2自带的launcher2稍作修改而成,使用eclipse调试。
一、首先要在Launcher的setupViews函数里面初始化自己的layout(需增加3个地方)
[java] view plaincopy
1.
dockbar=(DockBar)dragLayer.findViewById(R.id.dockbar);
dockbar.setLauncher(this);
dockbar.setDragController(dragController);
2.
dragController.setDragScoller(workspace);
dragController.setDragListener(deleteZone);
dragController.setDockDragListener(dockbar); // hmg25 add for dock
setDockDragListener为自定义函数,添加在DragController的startDrag中,具体见源码
if(mDockListener!=null){
mDockListener.onDragStart(source, dragInfo, dragAction);
}
3.
// The order here is bottom to top.
dragController.addDropTarget(workspace);
dragController.addDropTarget(dockbar); //hmg25 add for dock
dragController.addDropTarget(deleteZone);
二、在layout-port的launcher.xml中增加
[xhtml] view plaincopy
<!--hmg add for dock { -->
<com.android.launcher2.DockBar
android:id="@+id/dockbar"
android:layout_width="fill_parent"
android:layout_height="@dimen/button_bar_height"
android:layout_gravity="bottom|center_horizontal"
android:background="@drawable/dock_bg"
launcher:direction="horizontal">
<HorizontalScrollView android:id="@+id/dock_scroll_view"
android:scrollbars="none"
android:fadingEdge="none"
android:saveEnabled="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:orientation="horizontal"
android:id="@+id/dock_item_holder"
android:saveEnabled="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.android.launcher2.HandleView //默认将allapp按钮添加进去
android:id="@+id/all_apps_button"
android:layout_centerHorizontal="true"
android:src="/blog_article/@drawable/all_apps_button/index.html"
launcher:direction="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
android:clickable="true"
/>
</LinearLayout>
</HorizontalScrollView>
</com.android.launcher2.DockBar>
<!--hmg add for dock } -->
三、创建自定义的类:
[java] view plaincopy
public class DockBar extends LinearLayout implements DropTarget, DragSource,
DragController.DragListener,View.OnLongClickListener {
@Override
public boolean acceptDrop(DragSource source, int x, int y, int xOffset,int yOffset,DragView dragView, Object dragInfo) {
//接受什么类型的图标
Log.i("hmg", "DockBar->acceptDrop");
final ItemInfo item = (ItemInfo) dragInfo;
if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_PHOTO_FRAME
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_CLOCK) {
return false;
}
return true;
}
//拖拽释放时响应下边函数
@Override
public void onDrop(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
int position=0;
position=getLocation(x); //根据释放时的坐标,获取插入位置
addItemAt((ItemInfo)dragInfo, position);
}
/*
* 传入x坐标,判断新图标的位置,此处仅判断竖屏
*/
public int getLocation(int x){
for(int i=0;i<mItemHolder.getChildCount();i++){
View iv = mItemHolder.getChildAt(i);
int[] position = new int[2];
//获取坐标,如果要适应横屏可以稍作修改,比较Y值
iv.getLocationOnScreen(position);
//判断释放时新增的图标在原图标的之前还是之后
if(x<=(position[0]+(iv.getWidth()/2))){
return i;
}
}
return mItemHolder.getChildCount();
}
private void addItemAt(ItemInfo itemInfo, int position)
{
View view=null;
switch (itemInfo.itemType) {
case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
ShortcutInfo shortcutInfo;
// 拖拽图标来自于app list
if(itemInfo.container ==NO_ID&& itemInfo instanceof ApplicationInfo)
{
//与来自桌面的图标包含信息不一样,具体看源码
shortcutInfo= new ShortcutInfo((ApplicationInfo)itemInfo);
}
else
shortcutInfo = (ShortcutInfo)itemInfo; //拖拽图标来自桌面
//调用Launcher中的CreateDockShortcut生成一个imageView
view = mLauncher. CreateDockShortcut (shortcutInfo);
view.setOnLongClickListener(this);
break;
case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
break;
default:
throw new IllegalStateException("Unknown item type: "
+ itemInfo.itemType);
}
mItemHolder.addView(view, position);
}
之所以将新建view用Launcher. CreateDockShortcut是想直接使用Launcher中的单击事件。
View CreateDockShortcut (ShortcutInfo shortcutInfo)
{
Context context=getApplicationContext();
ImageView imageView =new ImageView(context);
imageView.setImageBitmap(shortcutInfo.mIcon);
imageView.setOnClickListener(this);
imageView.setFocusable(true);
imageView.setTag(shortcutInfo);
imageView.setMinimumWidth(100);
return imageView;
}
在dock上长按,拖拽交换位置或者拖拽出去
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
if (mLauncher.isAllAppsVisible())
mLauncher.closeAllApps(false);
mSelectedView = v;
//开始拖拽
mDragController.startDrag(v, this, v.getTag(),
DragController.DRAG_ACTION_MOVE);
removeSelectedItem();
return true;
}
private void removeSelectedItem()
{
if (mSelectedView == null)
return;
mItemHolder.removeView(mSelectedView);
}
代码修改了不少地方,具体看代码,修改的地方我都标注啦 ~~欢迎大家指教,相互交流~~
源码地址:http://download.csdn.net/source/3142047
最新技术文章: