資源描述:
《android入門教程如何利用Handler更新android的UI》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、android入門教程如何利用Handler更新android的UI新手剛開始接觸Android線程編程的時(shí)候,會(huì)想到如下使用如下代碼:Java代碼1newThread(newRunnable(){2publicvoidrun(){3myView.invalidate();4}5}).start();但是:該實(shí)現(xiàn)方法是不可行的。分析問題:因?yàn)椋篈ndroidUI操作并不是線程安全的,這些操作必須在UI線程中執(zhí)行。1.myView.invalidate()是UI操作;2.newThread創(chuàng)建了一個(gè)新的線程,是一個(gè)子線程
2、,而不是UI線程,在這個(gè)新的線程里面對(duì)view進(jìn)行刷新,這樣是不安全的。解決問題:那么如何解決這個(gè)問題呢?答案:使用Handler來實(shí)現(xiàn)UI線程的更新的。實(shí)現(xiàn)步驟:1.在view類里面定義一個(gè)Handler變量,這并沒有開啟一個(gè)新的線程,因此在handler里面更新本view是安全的;2.然后我們創(chuàng)建一個(gè)線程,通過這個(gè)線程來給activity的handler變量發(fā)送消息,同時(shí)通過這個(gè)線程進(jìn)行延時(shí)。意即:1.Handler接收消息和處理消息;2.創(chuàng)建一個(gè)線程,來給Handler發(fā)送消息;消息處理三部曲:1.發(fā)送消息;2.
3、接收消息;3.處理消息;代碼參考首先創(chuàng)建簡單的View,代碼如下:Java代碼1packagecom.ray.handler;2importandroid.content.Context;3importandroid.graphics.Canvas;4importandroid.graphics.Color;5importandroid.graphics.Paint;6importandroid.graphics.Point;1importandroid.graphics.drawable.Drawable;2impo
4、rtandroid.view.View;34publicclassBounceViewextendsView{56floatx=40;7publicBounceView(Contextcontext){8super(context);9}1011@Override12protectedvoidonDraw(Canvascanvas){13x+=10;14PaintmPaint=newPaint();15mPaint.setAntiAlias(true);16mPaint.setColor(Color.GREEN);17
5、canvas.drawCircle(x,40,40,mPaint);18}19}20創(chuàng)建Activity類,代碼如下:1Java代碼packagecom.ray.handler;2importandroid.app.Activity;3importandroid.content.Context;4importandroid.graphics.Canvas;5importandroid.graphics.Color;6importandroid.graphics.Paint;7importandroid.os.Bundl
6、e;8importandroid.os.Handler;9importandroid.os.Message;10importandroid.view.View;11importandroid.view.Window;1213publicclassTestHandlerextendsActivity{14protectedstaticfinalintGUIUPDATEIDENTIFIER=0x101;1516ThreadmyRefreshThread=null;17BounceViewmyBounceView=null;
7、1819HandlermyHandler=newHandler(){//在主線程中創(chuàng)建Handler對(duì)象20publicvoidhandleMessage(Messagemsg){//處理消息21switch(msg.what){1caseTestHandler.GUIUPDATEIDENTIFIER://2myBounceView.invalidate();//UI界面更新3break;4}5super.handleMessage(msg);6}7};8910publicvoidonCreate(Bundlesave
8、dInstanceState){1112super.onCreate(savedInstanceState);13this.requestWindowFeature(Window.FEATURE_NO_TITLE);14this.myBounceView=newBounceView(this);15this.setContentV