w1100n
This site is best viewed in Google Chrome
9/24/2012 22:58

通常大家安装软件都是从Andorid Market或者从网上下载到手机本地安装,这有两个问题,第一个情况碰到网速慢,那要急死,第二种情况是安装的太慢,如果软件多的话,手指累死,那么,就用adb安装吧,看我的操作情况: 首先把以前安装的软件备份到电脑,比如~/backup/,接着,打开电脑上的终端,取得root权限, # cd adb # ./adb start-server 打开另一个终端,默认用户权限 $ cd adb $ sh install.sh  (–sh里面的内容如这样:./adb install ~/backup/***.apk……,把你要装的软件都这样编辑,一行一个软件) ok,等着吧,安装完,切换到第一个终端,执行 # ./adb kill-server 安全移除手机,看看手机上是不是已经显示你安装的软件了,呵呵

8/26/2012 19:59

在操作系统中,线程是一个非常重要的资源,频繁创建和销毁大量线程会大大降低系统性能。Java线程池原理类似于数据库连接池,目的就是帮助我们实现线程复用,减少频繁创建和销毁线程。ThreadPoolExecutor ThreadPoolExecutor是线程池的核心类。首先看一下如何创建一个ThreadPoolExecutor。下面是ThreadPoolExecutor常用的一个构造方法:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) 参数介绍: corePoolSize 核心线程数量,线程池刚创建时,线程数量为0,当每次执行execute添加新的任务时会在线程池创建一个新的线程,直到线程数量达到corePoolSize为止。 workQueue 阻塞队列,当线程池正在运行的线程数量已经达到corePoolSize,那么再通过execute添加新的任务则会被加到workQueue队列中,在队列中排队等待执行,而不会立即执行。 maximumPoolSize 最大线程数量,当workQueue队列已满,放不下新的任务,再通过execute添加新的任务则线程池会再创建新的线程,线程数量大于corePoolSize但不会超过maximumPoolSize,如果超过maximumPoolSize,那么会抛出异常,如RejectedExecutionException。 keepAliveTime和unit 当线程池中线程数量大于workQueue,如果一个线程的空闲时间大于keepAliveTime,则该线程会被销毁。unit则是keepAliveTime的时间单位。 总结一下线程池添加任务的整个流程: 线程池刚刚创建是,线程数量为0; 执行execute添加新的任务时会在线程池创建一个新的线程; 当线程数量达到corePoolSize时,再添加新任务则会将任务放到workQueue队列; 当队列已满放不下新的任务,再添加新任务则会继续创建新线程,但线程数量不超过maximumPoolSize; 当线程数量达到maximumPoolSize时,再添加新任务则会抛出异常。 Executors Executors提供了一些创建线程池的工具方法。 Executors.newSingleThreadExecutor() 源码实现: new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()) corePoolSize和maximumPoolSize都为1,也就是创建了一个固定大小是1的线程池,workQueue是new LinkedBlockingQueue<Runnable>()也就是队列的大小是Integer.MAX_VALUE,可以认为是队列的大小不限制。 由此可以得出通过该方法创建的线程池,每次只能同时运行一个线程,当有多个任务同时提交时,那也要一个一个排队执行。 … Continue reading

8/19/2012 17:39 | Tag:

FrameLayout: FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前 一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。 LinearLayout: LinearLayout以你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有 一个元素,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout保持子元素之间的间隔以 及互相对齐(相对一个元素的右对齐、中间对齐或者左对齐)。 LinearLayout还支持为单独的子元素指定weight 。好处就是允许子元素可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串小对象挤 成一堆的情况,而是允许他们放大填充空白。子元素指定一个weight 值,剩余的空间就会按这些子元素指定的weight 比例分配给这些子元素。默认的 weight 值为0。例如,如果有三个文本框,其中两个指定了weight 值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框 不会放大。 AbsoluteLayout:   AbsoluteLayout是绝对位置布局。在此布局中的子元素的android:layout_x和android:layout_y属性将生效,用于描述该子元素的坐标位置。屏幕左上角为坐标原点(0,0),第一个0代表横坐标,向右移动此值增大,第二个0代表纵坐标,向下移动,此值增大。在此布局中的子元素可以相互重叠。在实际开发中,通常不采用此布局格式,因为它的界面代码过于刚性,以至于有可能不能很好的适配各种终端。 http://www.cnblogs.com/wisekingokok/archive/2011/08/23/2150452.html

8/17/2012 10:51

I’ve connected my Android phone to my Wifi network at work, but they use a proxy and I cannot use my browser without setting the proxy on my browser. Is there any way I can do this? The great thing … Continue reading

7/23/2012 12:54

http://www.itivy.com/android/archive/2012/5/4/634717451517462189.html 有一些场景,我们需要向用户展示一系列的页面。比如我们正在开发一个看漫画的应用,可能就需要向用户展示一张一张的漫画图片,用户使用手指滑动屏幕,可以在前一幅漫画和后一幅漫画之间切换。这个时候ViewFlipper就是一个很好的选择。   1)View切换的控件—ViewFlipper介绍 ViewFilpper类继承于ViewAnimator类。而ViewAnimator类继承于FrameLayout。 查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果。该类有如下几个和动画相关的方法。 setInAnimation:设置View进入屏幕时候使用的动画。该方法有两个重载方法,即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID。 setOutAnimation:设置View退出屏幕时候使用的动画。使用方法和setInAnimation方法一样。 showNext:调用该方法可以显示FrameLayout里面的下一个View。 showPrevious:调用该方法可以来显示FrameLayout里面的上一个View。 查看ViewFlipper的源码可以看到,ViewFlipper主要用来实现View的自动切换。该类提供了如下几个主要的方法。 setFilpInterval:设置View切换的时间间隔。参数为毫秒。 startFlipping:开始进行View的切换,时间间隔是上述方法设置的间隔数。切换会循环进行。 stopFlipping:停止View切换。 setAutoStart:设置是否自动开始。如果设置为“true”,当ViewFlipper显示的时候View的切换会自动开始。 一般情况下,我们都会使用ViewFilpper类实现View的切换,而不使用它的父类ViewAnimator类。 2)实现滑动—GestureDetector介绍 如果想要实现滑动翻页的效果,就要了解另外一个类:android.view.GestureDetector类。GestureDetector类中可以用来检测各种手势事件。该类有两个回调接口,分别用来通知具体的事件。 GestureDetector.OnDoubleTapListener:用来通知DoubleTap事件,类似于PC上面的鼠标的双击事件。 GestureDetector.OnGestureListener:用来通知普通的手势事件,该接口有六个回调方法,具体的可以查看API。这里想要实现滑动的判断,就需要用到其中的onFling()方法。 3)具体的实现 下面的代码片段详细说明了如何实现滑动翻页。 在这段代码里,创建了两个IamgeView(用来显示图片),加入到了ViewFlipper中。程序运行后,当用手指在屏幕上向左滑动,会显示前一个图片,用手指在屏幕上向右滑动,会显示下一个图片。实现滑动切换的主要代码都在onFling()方法中,用户按下触摸屏,快速移动后松开,就会触发这个事件。在这段代码示例中,对手指滑动的距离进行了计算,如果滑动距离大于100像素,就做切换动作,否则不做任何切换动作。 可以看到,onFling()方法有四个参数,e1和e2上面代码用到了,比较好理解。参数velocityX和velocityY是做什么用的呢?velocityX和velocityY实际上是X轴和Y轴上的移动速度,单位是像素/秒。结合这两个参数,可以判断滑动的速度,从而做更多的处理。 为了显示出滑动的效果,这里调用了ViewFlipper的setInAnimation()和setOutAnimation()方法设置了View进入和退出的动画。对于动画的使用,这里不再赘述,也不再给出具体的XML文件代码了。 另外,在上面的代码基础上说些额外的话题。 在Xml布局文件中,我们既可以设置像素px,也可以设置dp(或者dip)。 一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的手机上布局一致。但是在代码中,一般是无法直接使用dp的。 拿上面的代码为例,代码中定义了滑动的距离阀值为100像素。这就会导致不同分辨率的手机上效果有差别。比如在240X320的机型上,和在480X800的机型上,想要切换View,需要手指滑动的距离是不同的。所以,一般情况下,建议在代码中,也不要用像素,也用dp。 那么既然无法直接用dp,就需要从px转换成dp了。其实px和dp之间是有公式可以相互转换的。前面我的博客中(http://blog.csdn.net/arui319/article/details/6777133)已经写过了,可以直接参考。

7/21/2012 13:15

 1.网页说明编码格式 <meta http-equiv=”Content-Type” content=”text/html;charset=gb2312″>  2.设置WebView编码      httpview.getSettings().setDefaultTextEncodingName(“gbk”); 注意为gb2312或gbk 以上两种方法是网上给的比较好的方法,但是我都试了下都没有解决我的乱码问题。 原来我是用LoadData方法来解析html的,但是据说这是官方的一个BUG,不能用来解析中文。所以绕其道而行之,采用loadDataWithBaseURL的方法,其中codeingType设置为utf-8就OK了。

7/14/2012 20:24 | Tag:

本文来自http://blog.csdn.net/hellogv/ ListView是一个经常用到的控件,ListView里面的每个子项Item可以使一个字符串,也可以是一个组合控件。先说说ListView的实现: 1.准备ListView要显示的数据 ; 2.使用 一维或多维 动态数组 保存数据; 2.构建适配器 , 简单地来说, 适配器就是 Item数组 , 动态数组 有多少元素就生成多少个Item; 3.把 适配器 添加到ListView,并显示出来。 接下来,就开始UI的XML代码: main.xml代码如下,很简单,也不需要多做解释了: my_listitem.xml的代码如下,my_listitem.xml用于设计ListView的Item: 解释一下,里面用到的一些属性: 1.paddingBottom=”3dip”,Layout往底部留出3个像素的空白区域 2.paddingLeft=”10dip”,Layout往左边留出10个像素的空白区域 3.textSize=”30dip”,TextView的字体为30个像素那么大。 最后就是JAVA的源代码: view plaincopyprint? public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     //绑定XML中的ListView,作为Item的容器     ListView list = (ListView) findViewById(R.id.MyListView);     //生成动态数组,并且转载数据     ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();     for(int i=0;i<30;i++)     {         HashMap<String, String> map = new HashMap<String, String>();         map.put(“ItemTitle”, “This is Title…..”);         map.put(“ItemText”, “This is text…..”);         mylist.add(map);     }     //生成适配器,数组===》ListItem     SimpleAdapter mSchedule = new SimpleAdapter(this, //没什么解释                                                 mylist,//数据来源                                                 R.layout.my_listitem,//ListItem的XML实现                                                 //动态数组与ListItem对应的子项                                                 new String[] {“ItemTitle”, “ItemText”},                                                 //ListItem的XML文件里面的两个TextView ID                                                 new int[] {R.id.ItemTitle,R.id.ItemText});     //添加并且显示     list.setAdapter(mSchedule); … Continue reading

7/9/2012 22:51

Get subscription list. Each subscription contains a “category” if the user had created folders. It also has a field called firstitemmsec that denotes in milliseconds the time from which entries for that feed should be picked up. firstitemmsec initially stumped me until I … Continue reading

7/8/2012 23:05

http://blog.csdn.net/jin868/article/details/5961263 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种数据类型: 1.NULL:空值。 2.INTEGER:带符号的整型,具体取决有存入数字的范围大小。 3.REAL:浮点数字,存储为8-byte IEEE浮点数。 4.TEXT:字符串文本。 5.BLOB:二进制对象。 但实际上,sqlite3也接受如下的数据类型: smallint 16 位元的整数。 interger 32 位元的整数。 decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。 float  32位元的实数。 double  64位元的实数。 char(n)  n 长度的字串,n不能超过 254。 varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。 graphic(n) 和 char(n) 一样,不过其单位是两个字元 … Continue reading

7/8/2012 22:49

public class ListHymnsCategories extends Activity { private ListView listCats; private String catsName[]={“敬拜‧讚美”,”祈禱‧感恩”,”教導‧生活”,”見証‧委身”, “團契‧佈道”}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listCats=(ListView)findViewById(R.id.HymnsCatsListView); listCats.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , catsName)); listCats.setTextFilterEnabled(true); listCats.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> a, View v, int position, long id) … Continue reading

7/8/2012 22:40

http://stackoverflow.com/questions/4428117/google-reader-api-sortid-and-firstitemmsec When a user subscribes to a feed, the most recent 10 items in it (or items in the past 30 days, whichever results in fewer items) are considered unread for that user. The timestamp (in milliseconds since epoch) of … Continue reading

7/8/2012 19:24

http://qianjigui.iteye.com/blog/856259 数据结构MVCAndroid网络应用应用服务器 http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf 写道 在Android应用程序中,我们不能够非常清楚地区分MVC结构中的视图部分和控制器部分。Android框架期望开发者们将Activity基础类作为UI处理,这也就意味着一个Activity需要负责视图与控制器两个部分的任务。 利用观察者模式将Model进行绑定处理。 Android近期学习总结——开发笔记 写道 Android采用了典型的MVC结构。其表现如下: View既可以通过xml(layout目录下)生成,也可以通过硬编码的方式直接通过代码生成。对于xml中的View资源,可以在代码中通过getViewById()的方法获得。 Model既可以通过xml(values目录下)生成,也可以硬编码的方式直接在代码中指定。View和Model通过Adapter来进行连接。典型的Adapter包括ArrayAdapter(可以Sort()操作)、CusorAdapter(从Cusor中查询到数据源),ListAdapter、SimpleAdapter(最常用)、SpinnerAdapter(它是一个接口,设置Spinner应用SimpleAdapter的setDropDownResource方法)。 谈对android开发的认识 写道 Android应用开发一般来说由四大块构成 activity, intent, provider, broadcastreciver. 从这种结构上来看,android系统是提供了从显示层到数据层到消息机制的一整套的应用开发方案,而且是一种比较先进的解决方案。 从写android代码的过程中,android项目整体是一种典型的MVC结构,非常类似于主要用于WEB开发的J2EE架构。 xml布局文件是view相当于JSP页面; activity和intent起到了controller的作用; provider对数据层做了良好的封装,而且provider把数据管理的范畴从数据库泛化到了数据的概念,不光管理数据记录,只要是数据文件(图片、视频、声音文件、所有其他的一切的file)都纳入管理,且提供了数据共享的机制,这是比较出彩的地方; broadcastreceiver提供了一种良好的消息机制,使得一个应用不再是一个信息孤岛,而是和其他的应用、服务等构成了信息网络,从而极大的丰富了应用的开发空间,给了应用开发者极大的想象创造的可能。 在看了上述讨论后,我受益匪浅。按照以前开发RoR的经验,总觉得如果仅仅将xml布局看作View层未免太单薄,而且负责渲染与事件绑定的工作也全部落到了Activity的头上,这看上去不太合理。不过另一方面说,这看上去不合理的原因是自己见识的太少以及教条主义的影响。 那么究竟该如何划分这几层结构呢?我觉得可以换个思路出发,我们究竟该如何合理地组织一个Android应用程序呢?我们不必教条地、具有成见地将原先系统划分结构带入到这样一个新的框架结构中,而是需要在这个特定结构中发挥其框架的效果: xml布局负责将界面布局做好,并且尽量做到合理分割与减少层次 Activity做好控件事件绑定与业务流程控制 Intent做好Activity间的session传递管理 自己创建Model(可以通过Observer模式进行绑定处理、并且包装好各种provider)将处理数据的工作做好。不建议简单地将各个数据字段散乱地存放在Activity周围,而是借助数据Bean的思路存放在Model下面,这样在Model数据项变得庞大后难于管理与重构,而且这多为非面对对象的设计方案。 Adapter是数据与呈现的粘合剂 以上是个人在做了个Android的一个小应用后的反思与看法,整体上层次是非常低的。在这次开发中,我看到了自己在做客户端软件方面的一些问题,先分享与大家,希望能够共勉: 上手新框架时,成见较多,借助以前的思路机械搭建应用。这样没有合理发挥Android框架的优势,做了很多无用功。 整个知识网络的整合上面有欠缺,在做RoR时能够良好地利用Bean做数据传递与统一化工作。而在客户端程序时,将数据字段散乱的放在了Activity中。产生这个问题一方面来源于自己的懒惰,因为刚刚开始处理时字段就一个,所以就直接放上去了;到后来数据项激增,但是思路却没有变化。 Observer模式是个不错的方案,在应用开发中却没有应用。我觉得这也是在做RoR时的一些问题,和ASP.net不同(事件驱动,容易考虑到观察者模式),RoR多为URL传递后行为触发,各种行为被自然放在了control中。而在Android应用中,错误地将Activity简单地当作了Control,将业务控制逻辑放在了里面最后忘却了观察者模式。 测试->开发->重构,的模式可以进一步上升一个层次,对整个流程再重构,这样不至于陷入思维陷阱。

7/8/2012 16:48 | Tag:,

在Android应用程序开发中,我们有时可能会用到系统中自带内嵌的数据库sqlite3,例如我们在某个应用程序中创建了数据库,如何查看该数据库或者如何查看该数据库中包含有哪些表或数据。下面是我在应用程序中创建了一个数据库以及表,如何采用命令行的方式去查看该数据库和表 cd /data/data/com.wiloon.android.rsslab/databases sqlite3 RssLab .tables select * from tag; #com.wiloon.android.rsslab 是包名. #RssLab 是数据库名. #tag: 表名 .exit 退出. 查看字段名 .header on   查看sqlite3表结构的命令 在android下通过adb shell命令可以进入sqlite3的命令行client,见:在android命令行下使用sqlite3。 如果想列出该数据库中的所有表,可: .table 如果想查看这些表的结构: select * from sqlite_master where type=”table”; 可以看到类似:   默认情况下,不会出现红框中的表头,需要之前设置,命令为: .header on 如果只想查看具体一张表的表结构,比如查看emperors表,命令为: … Continue reading

7/8/2012 14:28

https://www.google.com/accounts/ClientLogin 获取你的所有标签信息 请求URL:https://www.google.com/reader/api/0/tag/list 方法:GET 参数: client: 客户端名称 ck:时间戳 output:输出结果类型,如json 返回:如果你已登录google,点击查看https://www.google.com/reader/api/0/tag/list?output=json 未读计数: https://www.google.com/reader/api/0/unread-count?output=json http://code.google.com/p/r2-release/wiki/GoogleReaderApi http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI http://undoc.in/googlereader.html

7/8/2012 13:10

1、问题提出 1)为何需要多线程? 2)多线程如何实现? 3)多线程机制的核心是啥? 4)到底有多少种实现方式? 2、问题分析 1)究其为啥需要多线程的本质就是异步处理,直观一点说就是不要让用户感觉到“很卡”。 eg:你点击按钮下载一首歌,接着该按钮一直处于按下状态,那么用户体验就很差。 2)多线程实现方式implements Runnable 或 extends Thread 3)多线程核心机制是Handler 4)提供如下几种实现方式 —-1—–Handler ————————————说明1 创建一个Handler时一定要关联一个Looper实例,默认构造方法Handler(),它是关联当前Thread的Looper。 eg: 我们在UI Thread中创建一个Handler,那么此时就关联了UI Thread的Looper! 这一点从源码中可以看出! 精简代码如下: public Handler() {         mLooper = Looper.myLooper(); //当前线程的Looper,在Activity创建时,UI线程已经创建了Looper对象 //在Handler中机制中Looper是最为核心的,它一直处于循环读MessageQueue,有 //要处理的Message就将Message发送给当前的Handler实例来处理 if (mLooper == null) { throw … Continue reading

7/8/2012 11:12

  本博文地址:http://blog.csdn.net/mylzc/article/details/6736988 转载请注明出处   Android异步处理系列文章索引 Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 Android异步处理二:使用AsyncTask异步更新UI界面 Android异步处理三:Handler+Looper+MessageQueue深入详解 Android异步处理四:AsyncTask的实现原理     概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程。而由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作。如果在非UI线程直接对UI进行了操作,则会报错:   CalledFromWrongThreadException:only the original thread that created a view hierarchy can touch its views 。 Android为我们提供了消息循环的机制,我们可以利用这个机制来实现线程间的通信。那么,我们就可以在非UI线程发送消息到UI线程,最终让Ui线程来进行ui的操作。   对于运算量较大的操作和IO操作,我们需要新开线程来处理这些繁重的工作,以免阻塞ui线程。   例子:下面我们以获取CSDN logo的例子,演示如何使用Thread+Handler的方式实现在非UI线程发送消息通知UI线程更新界面。       ThradHandlerActivity.java:     view … Continue reading

7/7/2012 11:15

Message.obtain函数:有多个obtain函数,主要功能一样,只是参数不一样。作用是从Message Pool中取出一个Message,如果Message Pool中已经没有Message可取则新建一个Message返回,同时用对应的参数给得到的Message对象赋值。 Message Pool:大小为10个;通过Message.mPool->(Message并且Message.next)-> (Message并且Message.next)-> (Message并且Message.next)…构造一个Message Pool。Message Pool的第一个元素直接new出来,然后把Message.mPool(static类的static变量)指向它。其他的元素都是使用完的 Message通过Message的recycle函数清理后放到Message Pool(通过Message Pool最后一个Message的next指向需要回收的Message的方式实现)。 1.2.MessageQueue MessageQueue里面有一个收到的Message的队列: MessageQueue.mMessages(static变量)->( Message并且Message.next)-> ( Message并且Message.next)->…, 上层代码通过Handler的sendMessage等函数放入一个message到MessageQueue里面时最终会调用MessageQueue的 enqueueMessage函数。enqueueMessage根据上面的接收的Message的队列的构造把接收到的Message放入队列中。 MessageQueue的removeMessages函数根据上面的接收的Message的队列的构造把接收到的Message从队列中删除,并且调用对应Message对象的recycle函数把不用的Message放入Message Pool中。 1.3.Looper Looper对象的创建是通过prepare函数,而且每一个Looper对象会和一个线程关联 Looper对象创建时会创建一个MessageQueue,主线程默认会创建一个Looper从而有MessageQueue,其他线程默认是没有 MessageQueue的不能接收Message,如果需要接收Message则需要通过prepare函数创建一个MessageQueue。具体操作请见示例代码。 prepareMainLooper函数只给主线程调用(系统处理,程序员不用处理),它会调用prepare建立Looper对象和MessageQueue。 Loop函数从MessageQueue中从前往后取出Message,然后通过Handler的dispatchMessage函数进行消息的处理(可见消息的处理是Handler负责的),消息处理完了以后通过Message对象的recycle函数放到Message Pool中,以便下次使用,通过Pool的处理提供了一定的内存管理从而加速消息对象的获取。至于需要定时处理的消息如何做到定时处理,请见 MessageQueue的next函数,它在取Message来进行处理时通过判断MessageQueue里面的Message是否符合时间要求来决定是否需要把Message取出来做处理,通过这种方式做到消息的定时处理。     1.4.Handler Handler的构造函数表示Handler会有成员变量指向Looper和MessageQueue,后面我们会看到为什么需要这些引用;至于callback是实现了Callback接口的对象,后面会看到这个对象的作用。 获取消息:直接通过Message的obtain方法获取一个Message对象。 发送消息:通过MessageQueue的enqueueMessage把Message对象放到MessageQueue的接收消息队列中 线程如何处理MessageQueue中接收的消息:在Looper的loop函数中循环取出MessageQueue的接收消息队列中的消息,然后调用 Hander的dispatchMessage函数对消息进行处理,至于如何处理(相应消息)则由用户指定(三个方法,优先级从高到低:Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;Handler里面的mCallback指向的一个实现了 Callback接口的对象,里面的handleMessage进行处理;处理消息Handler对象对应的类继承并实现了其中 handleMessage函数,通过这个实现的handleMessage函数处理消息)。 … Continue reading

7/7/2012 10:25

Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制 Android的消息机制(一) android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉超车等种种因素,只那么先进隧道的车将会先出,这个机制跟我们android 的消息机制是一样的。 一、 角色描述 1.Looper:(相当于隧道) 一个线程可以产生一个Looper 对象,由它来管理此线程里的Message Queue( 车队,消息隧道) 。 2.Handler: 你可以构造Handler 对象来与Looper 沟通,以便push 新消息到Message Queue 里;或者接收Looper( 从Message Queue 取出) 所送来的消息。 3. Message Queue( 消息队列): 用来存放线程放入的消息。 4 .线程:UI thread 通常就是main thread ,而Android 启动程序时会替它建立一个Message Queue 。 每一个线程里可含有一个Looper 对象以及一个MessageQueue … Continue reading

next page
辽ICP备14012896