Android移動開發(fā)基礎教程(慕課版)(第2版)課件 第8單元 高級編程_第1頁
Android移動開發(fā)基礎教程(慕課版)(第2版)課件 第8單元 高級編程_第2頁
Android移動開發(fā)基礎教程(慕課版)(第2版)課件 第8單元 高級編程_第3頁
Android移動開發(fā)基礎教程(慕課版)(第2版)課件 第8單元 高級編程_第4頁
Android移動開發(fā)基礎教程(慕課版)(第2版)課件 第8單元 高級編程_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8單元高級編程Android移動開發(fā)基礎教程(慕課版)(第2版)8.1網(wǎng)絡編程【知識描述】網(wǎng)絡編程是指多臺設備之間通過網(wǎng)絡進行數(shù)據(jù)交換。網(wǎng)絡通信基于“請求響應模型”,即一臺設備發(fā)送通信請求,另一臺設備進行反饋。發(fā)送請求端稱為客戶端,響應請求端稱為服務端。例如常見的QQ程序,用戶打開QQ客戶端程序之后,輸入用戶名和密碼,再單擊“登錄”,即向騰訊服務端發(fā)送登錄請求,服務端把請求結果反饋到客戶端。Android是基于Java進行開發(fā)的,所以JDK中關于網(wǎng)絡編程的API在Android中均可使用。8.1.1TCP、UDP基礎兩臺設備之間進行通信,一定要通過通信協(xié)議,即客戶端以一定的格式將數(shù)據(jù)發(fā)送出去,服務端接收到數(shù)據(jù)之后,可以根據(jù)同樣的協(xié)議將數(shù)據(jù)的內容解析出來。01TCP(TransmissionControlProtocol,傳輸控制協(xié)議)提供的是面向連接、可靠的字節(jié)流服務,通信雙方必須先建立一個TCP連接,然后才能傳輸數(shù)據(jù)。而且TCP還提供了超時重發(fā)、數(shù)據(jù)校驗、擁塞控制等功能,保證了數(shù)據(jù)的可靠傳輸。02UDP(UserDatagramProtocol,用戶數(shù)據(jù)報協(xié)議)應用于需要安全可靠地傳輸數(shù)據(jù)的場景,但是開銷比較大。UDP應用于對數(shù)據(jù)可靠性要求不是太高的場景,其優(yōu)點是開銷小,另外UDP沒有數(shù)據(jù)校驗、擁塞控制等功能,故而傳輸速度比較快。8.1.1TCP、UDP基礎對于上層應用來說,無論是TCP還是UDP,通信都包括客戶端和服務端,處理流程也具有一般性,具體如表8.1所示。客戶端處理流程:(1)根據(jù)服務端的IP地址和端口號建立網(wǎng)絡連接;(2)建立連接之后,進行數(shù)據(jù)交換,向服務端發(fā)送請求和接收服務端反饋的數(shù)據(jù);(3)關閉連接服務端處理流程:(1)服務端啟動之后,監(jiān)聽一個固定的端口,被動地等待客戶端連接;(2)在客戶端連接到服務端之后,服務端可以獲取客戶端的IP地址等信息,可以進行數(shù)據(jù)交換;(3)接收客戶端發(fā)送的數(shù)據(jù),然后把處理的結果反饋給客戶端;(4)關閉連接表8.1客戶端和服務端的處理流程8.1.2Socket通信任務8.1實現(xiàn)網(wǎng)絡通信【任務代碼】客戶端代碼:privatevoidstartClient(){Stringdata="HelloWorld";InputStreamis=null;OutputStreamos=null;Socketc=null;try{c=newSocket("01",7005);//建立連接

os=c.getOutputStream();//獲得輸出流

os.write(data.getBytes());//發(fā)送數(shù)據(jù)

is=c.getInputStream();//獲得輸入流

byte[]b=newbyte[1024];is.read(b);//接收反饋數(shù)據(jù)

}catch(Exceptione){e.printStackTrace();}finally{try{if(null!=c){c.close();}if(null!=is){is.close();is=null;}if(null!=os){os.close();os=null;}}catch(IOExceptione){e.printStackTrace();}}}8.1.2Socket通信客戶端首先定義了一個Socket對象向服務端請求建立連接,構造函數(shù)以服務端的IP地址和端口號作為參數(shù)。建立連接之后,調用getOutputStream()獲取輸出流,向服務端發(fā)送數(shù)據(jù)。【任務代碼】服務端代碼:privatevoidstartServer(){ServerSocketsc=null;try{sc=newServerSocket(7005);//監(jiān)聽端口號

while(true){Socketc=sc.accept();//被動地等待連接

newServerThread(c);//開啟一個線程處理客戶端請求

}}catch(Exceptione){e.printStackTrace();}finally{try{if(null!=sc){sc.close();sc=null;}}catch(Exceptione1){e1.printStackTrace();}}}8.1.2Socket通信服務端首先定義了一個ServerSocket對象,構造函數(shù)以將要監(jiān)聽的端口號作為參數(shù),然后調用accept()方法被動地等待連接。ServerThread代碼包含的是基本的I/O流操作ServerThread代碼:publicclassServerThreadextendsThread{privateSocketc=null;publicServerThread(Socketc){this.c=c;start();//啟動線程

}@Overridepublicvoidrun(){InputStreamis=null;try{if(null!=c){is=c.getInputStream();//獲取輸入流

}8.1.2Socket通信if(null!=is){byte[]b=newbyte[1024];intsize=is.read(b);//讀取接收到的消息

Log.i("Socket","themsgis:"+newString(b,0,size));}}catch(Exceptione){e.printStackTrace();}finally{try{if(null!=is){is.close();is=null;}if(null!=c){c.close();c=null;}}catch(Exceptione1){e1.printStackTrace();}}}}8.1.3下載網(wǎng)絡資源任務8.2下載網(wǎng)絡圖片【任務代碼】privateBitmapgetBitmap(Stringpath){Bitmapbm=null;try{URLurl=newURL(path);//創(chuàng)建一個URL對象,其參數(shù)為網(wǎng)絡圖片的超鏈接地址

//調用openConnection()方法開啟一個超鏈接

HttpURLConnectioncon=(HttpURLConnection)url.openConnection();//設置相關參數(shù)

con.setDoInput(true);con.setConnectTimeout(5000);con.setReadTimeout(2000);con.connect();InputStreamis=con.getInputStream();//獲取輸入流

bm=BitmapFactory.decodeStream(is);//將輸入流解析為Bitmap對象

is.close();}catch(Exceptione){e.printStackTrace();}returnbm;}8.2圖形圖像和動畫【知識描述】對于一個應用來說,圖片是一種很豐富的表達形式。Android中為圖片的處理提供了大量的API,不僅包括圖片的顯示、繪制,還包括一些簡單的動畫效果。8.2.1Bitmap和BitmapFactoryAndroid中提供了Bitmap類用于圖片處理,一個Bitmap對象代表一張位圖,其中存儲了圖片的尺寸、顏色、像素點等信息,Bitmap類提供了大量的方法,其常見的方法如表8.2所示。staticBitmapcreateBitmap(Bitmapsource,intx,inty,intwidth,intheight)靜態(tài)方法,以source圖片的(x,y)位置為起點,截取寬為width、高為height的圖片staticBitmapcreateBitmap(intwidth,intheight,Bitmap.Configconfig)創(chuàng)建一個Bitmap對象staticBitmapcreateScaledBitmap(Bitmapsrc,intdstWidth,intdstHeight,booleanfilter)將src圖像縮放后創(chuàng)建一個新的Bitmap對象finalintgetHeight()獲取Bitmap的高finalintgetWidth()獲取Bitmap的寬voidrecycle()回收Bitmap對象和對應像素點所占內存finalbooleanisRecycled()判斷Bitmap對象是否被回收intgetPixel(intx,inty)獲取圖片指定位置處像素點的值voidsetPixel(intx,inty,intcolor)設置圖片指定位置處像素點的值表8.2Bitmap常見的方法8.2.1Bitmap和BitmapFactoryBitmapFactory主要用于加載Bitmap對象,可以從資源文件解析,也可以根據(jù)圖片的路徑進行加載,還可以根據(jù)輸入流對Bitmap對象進行解析,相應的方法如表8.3所示。表8.3BitmapFactory的方法staticBitmapdecodeByteArray(byte[]data,intoffset,intlength,BitmapFactory.Optionsopts)將字節(jié)數(shù)組解析成Bitmap對象staticBitmapdecodeFile(StringpathName,BitmapFactory.Optionsopts)根據(jù)圖片的路徑加載Bitmap對象staticBitmapdecodeResource(Resourcesres,intid,BitmapFactory.Optionsopts)將資源文件解析成Bitmap對象staticBitmapdecodeStream(InputStreamis)將輸入流解析成Bitmap對象8.2.2Android繪圖基礎除了顯示已有的圖片之外,Android還支持一些簡單的二維繪圖,其實Android的一些基本組件,如TextView、Button等,也都是系統(tǒng)繪制出來的。繪制的操作在View類的onDraw(Canvascanvas)方法中,每個組件需要實現(xiàn)onDraw(Canvascanvas)方法進行自定義的繪制。Android的繪圖應該定義一個類,它繼承自View組件,并重新定義onDraw(Canvascanvas)方法。其中,參數(shù)Canvas可以理解為畫布,繪制操作均在Canvas上執(zhí)行。8.2.2Android繪圖基礎表8.4Canvas類支持的一些方法drawBitmap(Bitmapbitmap,floatleft,floattop,Paintpaint)從Bitmap對象的左上角開始繪制drawCircle(floatcx,floatcy,floatradius,Paintpaint)繪制一個圓drawLine(floatstartX,floatstartY,floatstopX,floatstopY,Paintpaint)繪制一條線drawPoint(floatx,floaty,Paintpaint)繪制一個點drawRect(floatleft,floattop,floatright,floatbottom,Paintpaint)繪制一個矩形drawText(Stringtext,floatx,floaty,Paintpaint)繪制一個字符串8.2.2Android繪圖基礎表8.5與Paint類相關的部分方法從表8.4中可以看出,每一個方法中都包含一個Paint類的參數(shù)。Paint類代表畫筆,Paint類的參數(shù)指定了畫筆的顏色和粗細等,與它相關的部分方法如表8.5所示。setAlpha(inta)設置畫筆的透明度setAntiAlias(booleanaa)設置是否抗鋸齒setColor(intcolor)設置畫筆的顏色setShader(Shadershader)設置畫筆的填充效果setShadowLayer(floatradius,floatdx,floatdy,intcolor)設置畫筆的陰影效果setStrokeWidth(floatwidth)設置畫筆的粗細setTextSize(floattextSize)設置繪制文字的大小8.2.2Android繪圖基礎任務8.3使用線性布局【任務代碼】自定義View代碼:publicclassCanvasViewextendsView{//自定義一個類繼承View組件

publicCanvasView(Contextcontext,AttributeSetattrs){super(context,attrs);}@OverrideprotectedvoidonDraw(Canvascanvas){//重寫onDraw()方法

super.onDraw(canvas);Paintpaint=newPaint();//定義一個畫筆對象

paint.setAntiAlias(true);//設置抗鋸齒

paint.setStyle(Paint.Style.STROKE);//設置畫筆的風格

paint.setStrokeWidth(5);//設置畫筆的粗細

paint.setColor(Color.GREEN);//設置畫筆的顏色

paint.setTextSize(24);//設置繪制的文字大小

canvas.drawCircle(60,60,50,paint);//繪制圓

canvas.drawLine(10,100,100,100,paint);//繪制線

canvas.drawRect(10,150,100,300,paint);//繪制矩形

canvas.drawText("HelloWorld",10,300,paint);//繪制字符串

}}圖8.1圖形的繪制8.2.3補間動畫表8.5與Paint類相關的部分方法在Android應用中,經常會出現(xiàn)一些動畫效果,例如控件的滑入與滑出、圖片的漸隱等。常見的實現(xiàn)方式有補間動畫和屬性動畫。補間動畫是指開發(fā)者指定控件的初始狀態(tài)和結束狀態(tài),系統(tǒng)自動補齊顯示控件的中間狀態(tài)。Android補間動畫支持的效果比較簡單,包括平移、縮放、旋轉、透明度變換,對應的類如表8.6所示。類說明TranslateAnimation用于實現(xiàn)平移動畫的類,需要指定控件起始和結束時的位置ScaleAnimation用于實現(xiàn)縮放動畫的類,需要指定動畫的縮放中心、起始的縮放比和結束時的縮放比RotateAnimation用于實現(xiàn)旋轉動畫的類,需要指定旋轉中心的坐標、起始的旋轉角度和結束時的旋轉角度AlphaAnimation用于實現(xiàn)透明度變換的類,需要指定起始的透明度和結束時的透明度8.2.3補間動畫任務8.4使用補間動畫本任務在Activity中定義了一張圖片和4個按鈕,這4個按鈕分別用于觸發(fā)4種動畫,運行結果如圖8.2所示。圖8.2補間動畫8.2.3補間動畫【任務代碼】MainActivity代碼:publicclassMainActivityextendsActivityimplementsOnClickListener{protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initWidget();}privatevoidinitWidget(){ButtonbtnTrans=(Button)findViewById(R.id.btn_translate);//獲取對應的4個按鈕

ButtonbtnScale=(Button)findViewById(R.id.btn_scale);ButtonbtnRotate=(Button)findViewById(R.id.btn_rotate);ButtonbtnAlpha=(Button)findViewById(R.id.btn_alpha);btnTrans.setOnClickListener(this);//設置監(jiān)聽事件

btnScale.setOnClickListener(this);btnRotate.setOnClickListener(this);btnAlpha.setOnClickListener(this);}8.2.3補間動畫publicvoidonClick(Viewv){ImageViewimgView=(ImageView)findViewById(R.id.img_pic);switch(v.getId()){caseR.id.btn_translate:{//平移動畫

TranslateAnimationtanim=newTranslateAnimation(0,100,0,0);tanim.setDuration(500);//設置動畫執(zhí)行的時間

tanim.setFillAfter(true);//設置動畫執(zhí)行后保持變化后的狀態(tài)

imgView.startAnimation(tanim);break;}caseR.id.btn_scale:{//縮放動畫

ScaleAnimationsanim=newScaleAnimation(0.0f,1.2f,0.0f,1.2f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);sanim.setDuration(500);sanim.setFillAfter(true);imgView.startAnimation(sanim);break;}8.2.3補間動畫caseR.id.btn_rotate:{//旋轉動畫

RotateAnimationranim=newRotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);ranim.setDuration(500);ranim.setFillAfter(true);imgView.startAnimation(ranim);break;}caseR.id.btn_alpha:{//透明度變換

AlphaAnimationanim=newAlphaAnimation(1.0f,0.0f);anim.setDuration(500);anim.setFillAfter(true);imgView.startAnimation(anim);break;}default:break;}}}8.2.4屬性動畫屬性動畫是在API11之后加入的功能,它幾乎可以作用在任何對象上,而且不同于補間動畫只能支持4種變換,屬性動畫可以在一定時間內將對象的屬性從一個初始值改變到另一個值,因此,只要是對象存在的屬性,無論是可見的還是不可見的,都可以實現(xiàn)動畫效果。屬性動畫可以通過ObjectAnimator實現(xiàn)。8.2.4屬性動畫任務8.5使用屬性動畫【任務代碼】MainActivity代碼:publicclassMainActivityextendsActivityimplementsOnClickListener{protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initWidget();}privatevoidinitWidget(){ButtonbtnTrans=(Button)findViewById(R.id.btn_translation);//獲取按鈕

ButtonbtnAlpha=(Button)findViewById(R.id.btn_alpha);btnTrans.setOnClickListener(this);//設置監(jiān)聽事件

btnAlpha.setOnClickListener(this);}@SuppressLint("NewApi")publicvoidonClick(Viewv){ImageViewimgView=(ImageView)findViewById(R.id.img_pic);switch(v.getId()){8.2.4屬性動畫caseR.id.btn_translation:{//平移

ObjectAnimatoranim=ObjectAnimator.ofFloat(imgView,"translationX",0,100);anim.setDuration(500);anim.start();break;}caseR.id.btn_alpha:{//透明度變換

ObjectAnimatoranim=ObjectAnimator.ofFloat(imgView,"alpha",1.0f,0.0f);anim.setDuration(500);anim.start();break;}default:break;}}}8.3多媒體應用開發(fā)【知識描述】在Android應用中,經常需要播放媒體資源,如播放音樂、播放視頻等。Android提供了MediaPlayer類,使用該類可以很簡單地實現(xiàn)播放本地或者網(wǎng)絡上的音/視頻的功能。8.3.1MediaPlayer類介紹MediaPlayer類提供了大量的方法用以控制音/視頻的播放、暫停、定位等,常見的方法如表8.7所示。表8.7MediaPlayer類常見的方法方法說明intgetCurrentPosition()獲取當前播放的位置intgetDuration()獲取音/視頻文件的總長intgetVideoHeight()獲取視頻的高度intgetVideoWidth()獲取視頻的寬度booleanisPlaying()判斷當前是否正在播放voidpause()暫停播放voidprepare()MediaPlayer開始準備(同步方法)voidprepareAsync()MediaPlayer開始準備(異步方法)voidrelease()釋放MediaPlayer占用的資源voidreset()重置MediaPlayer的狀態(tài)8.3.1MediaPlayer類介紹方法說明voidseekTo(intmsec)定位到音/視頻的指定位置,可用于實現(xiàn)快進、快退voidsetDataSource(Stringpath)設置視頻源setDataSource(Contextcontext,Uriuri)設置視頻源setDisplay(SurfaceHoldersh)用于顯示播放畫面setOnCompletionListener(MediaPlayer.OnCompletionListenerlistener)設置視頻播放完成時的監(jiān)聽事件setOnErrorListener(MediaPlayer.OnErrorListenerlistener)設置播放出現(xiàn)錯誤時的監(jiān)聽事件setOnPreparedListener(MediaPlayer.OnPreparedListenerlistener)設置MediaPlayer準備工作完成時的監(jiān)聽事件setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListenerlistener)設置定位完成時的監(jiān)聽事件voidstart()開始播放voidstop()停止播放8.3.2使用MediaPlayer和SurfaceView播放視頻播放的視頻必須顯示在View上,而且由于視頻的畫面一直在改變,所以View需要一直重繪。對于這種需要不斷更新View內容的場景,Android提供了SurfaceView類。SurfaceView關聯(lián)了一個SurfaceHolder對象,該對象專門用于繪制SurfaceView的內容。SurfaceHolder可以使用3個回調方法反饋SurfaceView的狀態(tài)表8.2Bitmap常見的方法方法說明surfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)SurfaceView的大小發(fā)生改變surfaceCreated(SurfaceHolderholder)SurfaceView第一次被創(chuàng)建完成surfaceDestroyed(SurfaceHolderholder)SurfaceView被銷毀8.3.2使用MediaPlayer和SurfaceView播放視頻任務8.6使用MediaPlayer和SurfaceView播放視頻【任務代碼】MainActivity代碼:publicclassMainActivityextendsActivityimplementsOnClickListener{privateSurfaceViewmSurface;privateButtonmBtnPlay;privateButtonmBtnPause;privateMediaPlayermPlayer=null;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initWidget();initPlayer();}privatevoidinitWidget(){mSurface=(SurfaceView)findViewById(R.id.surfaceView);//獲取SurfaceView控件8.3.2使用MediaPlayer和SurfaceView播放視頻mBtnPlay=(Button)findViewById(R.id.btn_play);mBtnPause=(Button)findViewById(R.id.btn_pause);mBtnPlay.setOnClickListener(this);mBtnPause.setOnClickListener(this);}publicvoidonClick(Viewv){switch(v.getId()){caseR.id.btn_play:{//單擊“播放”按鈕

if(null!=mPlayer&&!mPlayer.isPlaying())//判斷當前是否已經處于播放狀態(tài)

{mPlayer.start();//播放

}break;}caseR.id.btn_pause:{//單擊“暫?!卑粹o

if(null!=mPlayer&&mPlayer.isPlaying())//判斷當前是否已經處于播放狀態(tài)

{mPlayer.pause();//暫停

}break;}8.3.2使用MediaPlayer和SurfaceView播放視頻default:break;}}privatevoidinitPlayer(){mPlayer=newMediaPlayer();//定義一個MediaPlayer對象

//獲取SurfaceView關聯(lián)的SurfaceHolderSurfaceHolderholder=mSurface.getHolder();holder.addCallback(surfaceCallBack);//為SurfaceHolder添加回調函數(shù)

try{mPlayer.setOnPreparedListener(onPreparedListener);//設置監(jiān)聽事件

mPlayer.setDataSource("mnt/sdcard/demo.avi");//設置視頻源

mPlayer.prepareAsync();//調用異步準備方法

}catch(Exceptione){e.printStackTrace();}}8.3.2使用MediaPlayer和SurfaceView播放視頻privateOnPreparedListeneronPreparedListener=newOnPreparedListener(){publicvoidonPrepared(MediaPlayermp){//MediaPlayer準備完畢,開始播放

mp.start();}};privateSurfaceHolder.CallbacksurfaceCallBack=newSurfaceHolder.Callback(){publicvoidsurfaceDestroyed(SurfaceHolderholder){//TODO自動生成方法存根

}publicvoidsurfaceCreated(SurfaceHolderholder){//SurfaceView創(chuàng)建成功

mPlayer.setDisplay(holder);//為MediaPlayer設置SurfaceHolder}8.3.2使用MediaPlayer和SurfaceView播放視頻@OverridepublicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){//TODO自動生成方法存根

}};protectedvoidonDestroy(){//頁面銷毀時釋放MediaPlayer占用的資源

if(null!=mPlayer){mPlayer.stop();mPlayer.release();mPlayer=null;}super.onDestroy();}}8.3.2使用MediaPlayer和SurfaceView播放視頻act_main.xml布局文件:<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:orientation="vertical">//定義一個SurfaceView布局

<SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="400dp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:orientation="horizontal"><Button8.3.2使用MediaPlayer和SurfaceView播放視頻android:id="@+id/btn_play"android:layout_width="100dp"android:layout_height="100dp"android:gravity="center"android:textSize="18sp"android:text="play"/><Buttonandroid:id="@+id/btn_pause"android:layout_width="100dp"android:layout_height="100dp"android:gravity="center"android:textSize="18sp"android:text="pause"/></LinearLayout></LinearLayout>8.4線程開發(fā)【知識描述】線程在程序開發(fā)中是一個很重要的概念。在Android中,線程分為主線程和子線程。主線程又叫作UI線程,主要處理和界面有關的事情,用于界面的繪制和交互。用戶隨時都有可能操作界面,而且對其響應速度要求較高,因此,主線程中不能做太耗時的操作,否則會讓用戶視覺上感覺到卡頓,甚至有可能會因為執(zhí)行阻塞產生ANR而導致應用異常退出。8.4.1AsyncTask介紹AsyncTask是一個執(zhí)行異步操作的類,它在主線程中創(chuàng)建和觸發(fā),但是在子線程中執(zhí)行后臺任務,然后將執(zhí)行的進度和最終結果傳遞給主線程并在主線程中更新UI。例如有一種很常見的操作:應用中如果要在ImageView控件中顯示一張網(wǎng)絡圖片,首先需要從網(wǎng)絡上下載圖片,然后將其顯示到控件上。表8.7MediaPlayer類常見的方法方法說明doInBackground()在后臺執(zhí)行任務onProgressUpdate()回調當前執(zhí)行的進度onPostExecute()任務執(zhí)行完成8.4.1AsyncTask介紹它們的具體使用方法如下所示:publicvoidonClick(Viewv){newDownloadImageTask().execute("/image.png");//執(zhí)行異步任務}privateclassDownloadImageTaskextendsAsyncTask<String,Void,Bitmap>{protectedBitmapdoInBackground(String...arg0){//在后臺執(zhí)行任務

Stringurl=args[0];//獲取參數(shù)

Bitmapbitmap=downloadImgByUrl(url);//執(zhí)行下載任務

returnbitmap;//返回執(zhí)行結果

}protectedvoidonPostExecute(Bitmapresult){//下載完成之后回調該方法

mImageView.setImageBitmap(result);//對返回結果進行處理

}protectedvoidonProgressUpdate(Void...values){//回調下載進度

super.onProgressUpdate(values);}}8.4.2ThreadPoolExecutor介紹當一個應用中需要創(chuàng)建多個線程時,可以將該應用放入線程池中進行管理,Java中使用Executor實現(xiàn)線程池的管理和線程的調度。Executor是一個接口,它的實現(xiàn)類為ThreadPoolExecutor。創(chuàng)建ThreadPoolExecutor對象時,可以向構造函數(shù)傳入一系列的參數(shù)來配置線程池。8.4.2ThreadPoolExecutor介紹corePoolSize線程池的核心線程數(shù)Part01maximumPoolSize線程池可以容納的最多的線程數(shù)Part02keepAliveTime非核心線程在空閑時可以存活的時間Part03unit參數(shù)keepAliveTime的單位Part04workQueue線程隊列Part05threadFactory線程工廠,用于在線程池中創(chuàng)建線程Part068.4.2ThreadPoolExecutor介紹當調用ThreadPoolExecutor的execute()方法要求執(zhí)行一個任務時,線程池會判斷當前的線程數(shù)是否超過核心線程數(shù),如果沒有超過,則啟動一個核心線程來執(zhí)行任務如果線程池有線程處于空閑狀態(tài),則在指定keepAliveTime后回收線程,當線程數(shù)等于核心線程數(shù)時,停止回收線程如果線程的總數(shù)已經達到了線程池可以容納的最多的線程數(shù),則拒絕接收任務如果當前的線程數(shù)超過了核心線程數(shù),則將任務放到線程隊列中排隊等候15423如果線程隊列已滿,則啟動一個非核心線程來執(zhí)行任務8.4.2ThreadPoolExecutor介紹線程池的創(chuàng)建代碼:publicclassMain{publicstaticvoidmain(String[]args){ThreadPoolExecutorexecutor=newThreadPoolExecutor(1,3,1,TimeUnit.MINUTES,newArrayBlockingQueue(4));//創(chuàng)建一個線程池對象

executor.execute(newTask());//執(zhí)行一個任務

}}需要執(zhí)行的任務:publicclassTaskextendsThread{//繼承Thread類

publicvoidrun(){//重寫父類的run()方法

super.run();System.out.println("thisisataskinthread");//執(zhí)行自己的操作

}}8.5Fragment【知識描述】為了更加動態(tài)和靈活地支持UI設計,Android在API11之后引入了Fragment,它可以將UI碎片化,也可以被復用。Fragment必須顯示在Activity中,可以被動態(tài)地添加、移除、替換,但是每個Fragment都具有自己的生命周期方法,并且可以單獨處理用戶的輸入事件。8.5Fragment常見的微信界面(見圖8.3)就可以使用Fragment來實現(xiàn)。單擊界面下方的“微信”,界面中間內容區(qū)域就會對應顯示聊天記錄;單擊“通訊錄”,界面中間內容區(qū)域就會顯示聯(lián)系人列表。這些功能用Activity實現(xiàn)比較麻煩,但是用Fragment實現(xiàn)就比較簡單。將界面的整體定義為一個Activity,界面中間內容區(qū)域設計為一個Fragment,實現(xiàn)根據(jù)用戶單擊的Item動態(tài)地更換顯示區(qū)域的Fragment。圖8.3微信界面8.5.1Fragment的創(chuàng)建和Activity類似,創(chuàng)建自定義的Fragment需要繼承基類Fragment,并實現(xiàn)基類的若干個方法。其中比較常見的是onCreate()、onCreateView()、onPause()方法。onPause()方法在用戶離開Fragment時會回調onCreateView()在繪制Fragment視圖的時候會回調,開發(fā)者需要在該方法中加載Fragment需要顯示的布局文件onCreate()方法在創(chuàng)建Fragment時會回調8.5.1Fragment的創(chuàng)建FragmentTransaction類支持的常見方法如表8.10所示。方法說明add(intcontainerViewId,Fragmentfragment)在Activity指定的位置添加一個Fragmentcommit()提交事務hide(Fragmentfragment)隱藏當前的Fragmentremove(Fragmentfragment)從Activity中移除一個Fragmentreplace(intcontainerViewId,Fragmentfragment)在指定位置處替換一個Fragmentshow(Fragmentfragment)顯示之前隱藏的Fragment表8.10FragmentTransaction類支持的常見方法8.5.1Fragment的創(chuàng)建任務8.7單擊底部按鈕,中間內容區(qū)域動態(tài)改變本任務運行結果如圖8.4所示,單擊底部按鈕,中間內容區(qū)域動態(tài)改變。圖8.4Fragment實現(xiàn)效果8.5.1Fragment的創(chuàng)建【任務代碼】FragmentFriend代碼:publicclassFragmentFriendextendsFragment{//定義一個類繼承FragmentpublicvoidonCreate(BundlesavedInstanceState){//重寫onCreate()方法

super.onCreate(savedInstanceState);}//重寫onCreateView()方法,在其中加載布局文件

publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewview=inflater.inflate(R.layout.view_fragment,container,false);//加載布局文件

TextViewtxtView=(TextView)view.findViewById(R.id.txt_title);txtView.setText("ThisisFriendUI");//設置布局中的文字

returnview;}}8.5.1Fragment的創(chuàng)建FragmentContact代碼:publicclassFragmentContactextendsFragment{//和FragmentFriend代碼類似

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);}publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewview=inflater.inflate(R.layout.view_fragment,container,false);TextViewtxtView=(TextView)view.findViewById(R.id.txt_title);txtView.setText("ThisisContactUI");returnview;}}8.5.1Fragment的創(chuàng)建view_fragment.xml代碼:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><TextViewandroid:id="@+id/txt_title"android:layout_width="300dp"android:layout_height="100dp"android:textSize="36sp"android:text="ThisisFriendUI"/></LinearLayout>8.5.1Fragment的創(chuàng)建MainActivity代碼:publicclassMainActivityextendsActivityimplementsOnClickListener{privateFragmentmFriendFrag=null;//定義Fragment變量

privateFragmentmContactFrag=null;privateFragmentmFindFrag=null;privateFragmentmSettingFrag=null;

protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initWidget();}privatevoidinitWidget(){mFriendFrag=newFragmentFriend();//創(chuàng)建一個FragmentFriend對象

FragmentTransactionft=getFragmentManager().beginTransaction();//開啟一個事務8.5.1Fragment的創(chuàng)建ft.replace(R.id.lly_content,mFriendFrag);//初始顯示聊天記錄界面

mit();//事務提交

ButtonbtnFriend=(Button)findViewById(R.id.btn_friend);//獲取按鈕

ButtonbtnContact=(Button)findViewById(R.id.btn_contact);ButtonbtnFind=(Button)findViewById(R.id.btn_find);ButtonbtnSetting=(Button)findViewById(R.id.btn_setting);btnFriend.setOnClickListener(this);//為按鈕添加單擊事件監(jiān)聽器

btnContact.setOnClickListener(this);btnFind.setOnClickListener(this);btnSetting.setOnClickListener(this);}@OverridepublicvoidonClick(Viewview){FragmentTransactionft=getFragmentManager().beginTransaction();//開啟一個事務

switch(view.getId()){caseR.id.btn_friend://聊天記錄

{if(null==mFriendFrag)8.5.1Fragment的創(chuàng)建{mFriendFrag=newFragmentFriend();//創(chuàng)建對應的Fragment對象

}ft.replace(R.id.lly_content,mFriendFrag);//調用replace()方法替換當前Fragmentbreak;}caseR.id.btn_contact://通訊錄

{if(null==mContactFrag){mContactFrag=newFragmentContact();}ft.replace(R.id.lly_content,mContactFrag);break;}caseR.id.btn_find://發(fā)現(xiàn)

{if(null==mFindFrag){mFindFrag=newFragmentFind();}8.5.1Fragment的創(chuàng)建ft.replace(R.id.lly_content,mFindFrag);break;}caseR.id.btn_setting://設置

{if(null==mSettingFrag){mSettingFrag=newFragmentSetting();}ft.replace(R.id.lly_content,mSettingFrag);break;}default:break;}mit();}}8.5.1Fragment的創(chuàng)建activity_main.xml代碼:<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><FrameLayout//定義一個組件,該組件用于占用該位置,并顯示Fragmentandroid:id="@+id/lly_content"android:layout_width="match_parent"android:layout_height="400dp"/><LinearLayoutandroid:layout_width="match_par

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論