Android移動(dòng)應(yīng)用開發(fā)基礎(chǔ)教程第8章_第1頁
Android移動(dòng)應(yīng)用開發(fā)基礎(chǔ)教程第8章_第2頁
Android移動(dòng)應(yīng)用開發(fā)基礎(chǔ)教程第8章_第3頁
Android移動(dòng)應(yīng)用開發(fā)基礎(chǔ)教程第8章_第4頁
Android移動(dòng)應(yīng)用開發(fā)基礎(chǔ)教程第8章_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Android移動(dòng)應(yīng)用開發(fā)基礎(chǔ)教程講授:XXXXX第8章 線程和服務(wù)本章主要內(nèi)容:多線程服務(wù)8.1多線程 在運(yùn)行一個(gè)Android應(yīng)用時(shí),系統(tǒng)為其創(chuàng)建一個(gè)獨(dú)立主線程。在程序執(zhí)行一些比較耗時(shí)的操作(如打開網(wǎng)頁)時(shí),應(yīng)用界面此時(shí)無法響應(yīng)用戶操作。將耗時(shí)操作放到子線程中去執(zhí)行。子線程與主線程可以異步同時(shí)運(yùn)行。當(dāng)子線程去執(zhí)行耗時(shí)操作時(shí),用戶可在界面中執(zhí)行其他操作。本節(jié)主要內(nèi)容:線程的基本用法如何在使用多線程時(shí)更新UI使用AsyncTask 8.1.1 線程的基本用法使用匿名類創(chuàng)建線程。例如:new Thread(new Runnable() Override public void run() /在此

2、編寫線程功能代碼 ).start();new Thread()方法創(chuàng)建了一個(gè)線程對象,然后調(diào)用start()方法啟動(dòng)線程。new Runnable() 創(chuàng)建了一個(gè)匿名類來實(shí)現(xiàn)Runnable接口,在其run()方法中編寫實(shí)現(xiàn)線程功能的代碼。也可創(chuàng)建一個(gè)類來實(shí)現(xiàn)Runnable接口。例如:class MyThread implements Runnable Override public void run() /在此編寫線程功能代碼 然后,按照下面的方式來啟動(dòng)線程。new Thread(new MyThread().start();也可定義一個(gè)類繼承內(nèi)置的Thread類來實(shí)現(xiàn)線程功能。例如:cl

3、ass MyThread extends Thread Override public void run() /在此編寫線程功能代碼 然后,按照下面的方式來啟動(dòng)線程。new MyThread().start();8.1.2如何在使用多線程時(shí)更新UI在Android中,不允許在主線程之外的子線程中修改應(yīng)用界面。例如,試圖在子線程中將處理結(jié)果顯示在Text View中,這樣做會(huì)導(dǎo)致程序拋出異常。private void showResult(final String result) runOnUiThread(new Runnable() Override public void run() te

4、xtView.setText(result); );runOnUiThread()方法返回UI線程(也就是主線程)去執(zhí)行,所以在其中設(shè)置TextView文本沒有任何問題。實(shí)例項(xiàng)目:源代碼08UseThreadMessagepublic class MainActivity extends AppCompatActivity private Handler handler=new Handler() Override public void handleMessage(Message msg) TextView textView=(TextView)findViewById(R.id.tvMsg

5、); textView.setText(msg.obj.toString(); ;實(shí)例項(xiàng)目:源代碼08UseThreadMessageprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button=(Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() Over

6、ride public void onClick(View v) new Thread(new Runnable() Override public void run() Message message=new Message(); message.obj=new String(線程中傳回的數(shù)據(jù)); handler.sendMessage(message); ).start();Android中線程之間的消息傳遞也稱異步消息處理機(jī)制,主要由Message、Handler、MessageQueue和Looper來完成。1、Message:消息Message用于封裝消息,它的arg1、arg2和w

7、hat字段用于存放int類型數(shù)據(jù),obj字段用于存放任意類型的對象。2、Handler:消息處理器Handler主要用于發(fā)送和處理消息。通常,在子線程中調(diào)用sendMessage()方法發(fā)送消息。在主線程中執(zhí)行handleMessage()方法處理消息。消息的發(fā)送和處理是異步執(zhí)行的,不能期望消息發(fā)送之后,Handler能立即處理消息。3、MessageQueue:消息隊(duì)列通過Handler發(fā)送的消息都保存在消息隊(duì)列中,等待被處理。4、Looper:消息循環(huán)Looper主要完成消息派遣任務(wù)。Looper維持一個(gè)無限循環(huán),不停地檢查消息隊(duì)列中是否存在消息。當(dāng)Looper發(fā)現(xiàn)消息隊(duì)列中有消息時(shí),就將

8、隊(duì)列最前面的消息取出,傳遞給Handler。8.1.3使用AsyncTaskAsyncTask是Android為了簡化使用線程數(shù)據(jù)更新UI而提供的一個(gè)抽象類。使用AsyncTask,不需要了解線程和異步消息處理機(jī)制,即可完成異步任務(wù)的執(zhí)行。AsyncTask是一個(gè)抽象類,在使用時(shí)需要?jiǎng)?chuàng)建一個(gè)類來繼承它private class MyAsyncTask extends AsyncTask Override protected void onPreExecute() /異步任務(wù)開始執(zhí)行之前執(zhí)行的代碼 Override protected void onPostExecute(String s) /

9、異步任務(wù)執(zhí)行結(jié)束之后執(zhí)行的代碼 Override protected void onProgressUpdate(String. values) /異步任務(wù)執(zhí)行過程中執(zhí)行的代碼 Override protected String doInBackground(int. params) /異步任務(wù)代碼 在繼承AsyncTask時(shí),首先需要指定3個(gè)泛型參數(shù),其作用分別如下:第1個(gè)泛型參數(shù):指定doInBackground()方法參數(shù)params的數(shù)據(jù)類型。參數(shù)params也稱傳入?yún)?shù),保存調(diào)用AsyncTask子類構(gòu)造函數(shù)時(shí)傳入的參數(shù)。第2個(gè)泛型參數(shù):指定onProgressUpdate ()方法

10、參數(shù)values的數(shù)據(jù)類型。參數(shù)values保存在異步任務(wù)執(zhí)行過程中傳遞回來的數(shù)據(jù)。第3個(gè)泛型參數(shù):指定onPostExecute ()方法參數(shù)和doInBackground()方法返回值的數(shù)據(jù)類型。此外,還需重寫幾個(gè)方法完成相應(yīng)任務(wù)。onPreExecute()方法:在異步任務(wù)開始執(zhí)行之前被調(diào)用,并在主線程中運(yùn)行。onPostExecute ()方法:在異步任務(wù)執(zhí)行結(jié)束之后被調(diào)用,并在主線程中運(yùn)行。onProgressUpdate ()方法:在異步任務(wù)代碼中,可調(diào)用publishProgress ()方法向主線程返回?cái)?shù)據(jù),onProgressUpdate ()方法參數(shù)接收返回的數(shù)據(jù)。onPr

11、ogressUpdate ()方法也在主線程中執(zhí)行。doInBackground()方法:異步任務(wù)代碼,在子線程中執(zhí)行。onPostExecute ()方法參數(shù)接收doInBackground()方法的返回值。8.2服務(wù) 通常,一個(gè)應(yīng)用通過UI與用戶進(jìn)行交互。一些特殊的應(yīng)用,例如與Web服務(wù)器的數(shù)據(jù)傳輸、下載文件、與服務(wù)器保持推送連接等,并不需要用戶界面。這種應(yīng)用就可使用服務(wù)來實(shí)現(xiàn)。本節(jié)主要內(nèi)容:使用服務(wù)使用綁定服務(wù)8.2.1使用服務(wù)創(chuàng)建的服務(wù)類package com.example.xbg.useservice;import android.app.Service;import androi

12、d.os.IBinder;import android.content.Intent;public class MyService extends Service public MyService() Override public IBinder onBind(Intent intent) / TODO: Return the communication channel to the service. throw new UnsupportedOperationException(Not yet implemented); 實(shí)現(xiàn)服務(wù)具體功能時(shí),還需要重寫Service的下列方法。public

13、 void onCreate() super.onCreate();Overridepublic int onStartCommand(Intent intent, int flags, int startId) return super.onStartCommand(intent, flags, startId);Overridepublic void onDestroy() super.onDestroy();在調(diào)用startService()方法啟動(dòng)服務(wù)時(shí),如果該服務(wù)還沒有創(chuàng)建,則首先創(chuàng)建該服務(wù),并執(zhí)行onCreate()方法。如果服務(wù)已經(jīng)創(chuàng)建,則不會(huì)執(zhí)行onCreate()方法。注意,

14、不管是在當(dāng)前應(yīng)用或其他應(yīng)用中啟動(dòng)服務(wù),服務(wù)的實(shí)例只有一個(gè),onCreate()方法只執(zhí)行一次。調(diào)用startService()方法啟動(dòng)服務(wù)時(shí),如果服務(wù)已經(jīng)創(chuàng)建,則執(zhí)行onStartCommand()方法。每調(diào)用一次startService()方法,onStartCommand()方法就會(huì)執(zhí)行一次。服務(wù)啟動(dòng)后就會(huì)一直運(yùn)行,調(diào)用stopService()方法(服務(wù)外調(diào)用)或stopSelf()方法(服務(wù)內(nèi))來停止服務(wù)。服務(wù)停止時(shí),或執(zhí)行onDestroy()方法。在調(diào)用了bindService()方法綁定了服務(wù),然后調(diào)用unbindService()方法解除綁定時(shí),也會(huì)執(zhí)行onDestroy()方

15、法。從onCreate()方法到onDestroy()方法,經(jīng)歷服務(wù)的創(chuàng)建到銷毀,是服務(wù)的一個(gè)完整生命周期。在程序清單文件AndroidManifest.xml中添加服務(wù)注冊消息。例如: 實(shí)現(xiàn)了服務(wù)類后,就可通過調(diào)用startService()方法啟動(dòng)服務(wù)。例如:startService(new Intent(MainActivity.this,MyService.class);停止服務(wù)時(shí),調(diào)用stopService()方法。例如。stopService(new Intent(MainActivity.this,MyService.class);注意,在啟動(dòng)和停止服務(wù)時(shí),雖然使用的是新建的In

16、tent對象,但訪問的是同一個(gè)服務(wù),因?yàn)榉?wù)實(shí)例始終只有一個(gè)。8.2.2 使用綁定服務(wù)上一節(jié)中介紹的服務(wù)使用方法,可以稱為服務(wù)的普通用法。在這種方式下,活動(dòng)對服務(wù)控制只有啟動(dòng)和停止操作,服務(wù)中的代碼如何執(zhí)行與活動(dòng)沒有任何關(guān)系。Android提供了一種可以讓活動(dòng)和服務(wù)進(jìn)行交互的方法綁定服務(wù)。使用綁定服務(wù),活動(dòng)可以主動(dòng)啟動(dòng)服務(wù)操作,并從服務(wù)返回?cái)?shù)據(jù)。在實(shí)現(xiàn)服務(wù)類時(shí),onBind()方法返回一個(gè)IBinder對象,該對象通常是一個(gè)自定義的Binder子類的實(shí)例對象。通過IBinder對象,我們可以在活動(dòng)中讓任務(wù)完成指定操作。要使用綁定類,首先需要實(shí)現(xiàn)服務(wù)類,并通過onBind()方法返回綁定對象。實(shí)

17、例項(xiàng)目:源代碼08UseBindServicepackage com.example.xbg.usebindservice;import android.app.Service;public class MyService extends Service public MyService() Override public IBinder onBind(Intent intent) return new MyBinder();/返回自定義綁定對象 class MyBinder extends Binder/自定義綁定類 private int result=0; public void sta

18、rtDoSomething(int data) Log.e(MyService,MyBinder.startDoSomething()方法執(zhí)行.); for(int i=0;idata.length;i+) result+=datai; public int getResult()return result; 實(shí)例項(xiàng)目:源代碼08UseBindServicepackage com.example.xbg.usebindservice;import android.content.ComponentName;public class MainActivity extends AppCompatA

19、ctivity implements View.OnClickListener class MyServiceConnection implements ServiceConnection Override public void onServiceConnected(ComponentName name, IBinder service) Log.e(MainActivity,服務(wù)綁定完成); MyService.MyBinder myBinder= (MyService.MyBinder) service; myBinder.startDoSomething(new int1,2,3,4,5); Log.e(MainActivity,服務(wù)返回?cái)?shù)據(jù):+ myBinder.getResult(); Override public void onServiceDisconnec

溫馨提示

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

最新文檔

評論

0/150

提交評論