android ui - 服務,異步任務和線程之間的區別?




example handler (7)

服務,異步任務和線程有什麼區別。 如果我沒有錯,所有這些都是用來做背景的東西。 那麼,如何決定使用哪個以及何時使用?


Answers

線程是並發執行單元。 它有自己的調用堆棧。 有兩種方法可以在應用程序中實現線程。

一種是提供一個擴展Thread並覆蓋run()方法的新類。 另一個是在創建期間提供一個帶有Runnable對象的新Thread實例。 一個線程可以通過調用它的“start”方法來執行。 您可以通過調用其“setPriority(int)”方法來設置線程的“優先級”。

如果您在UI部分中沒有任何影響,則可以使用線程。 例如,您正在調用某個Web服務或下載一些數據,並且在下載後,您將其顯示在屏幕上。 然後,您需要使用帶有線程的處理程序,這會使您的應用程序變得複雜,無法處理來自線程的所有響應。

Handler允許您發送和處理與線程的MessageQueue關聯的Message和Runnable對象。 每個線程都有每個消息隊列。 (就像一個待辦事項列表),線程將會處理每條消息並處理它,直到消息隊列為空。 所以,當處理程序通信時,它只是向調用者線程發送一條消息,並等待處理。

如果您使用Java線程,那麼您需要在自己的代碼中處理以下要求:

  • 如果將結果回發給用戶界面,則與主線程同步無取消線程的默認值無默認線程池在Android中處理配置更改時沒有默認值

的AsyncTask

AsyncTask支持正確和簡單地使用UI線程。 該類允許在UI線程上執行後台操作和發布結果,而無需操作線程和/或處理程序。 異步任務由在後台線程上運行的計算定義,並且其結果在UI線程上發布。

AsyncTask將經歷以下4個階段:

onPreExecute()

在任務執行前在UI線程上調用

doInbackground(PARAMS ..)

onPreExecute()完成執行後立即在後台線程上調用。

onProgressUpdate(進步..)

調用publishProgress(Progress ...)後在UI線程上調用。

onPostExecute(結果)

後台計算完成後在UI線程上調用。
為什麼你應該使用AsyncTask?

易於使用的UI線程。 (所以,當調用者線程是UI線程時使用它)。 無需操作處理程序。

服務 “服務”與“活動”類似,但沒有GUI。

重要提示 :服務不會在新線程中運行!

閱讀關於Service ,並檢查如何總是在後台運行服務


這是你的問題最簡單的答案

是運行“並行”到主線程的執行單元是重要的一點,您不能從主線程更新UI組件。

的AsyncTask

是用於短任務,因為它與主機活動相關聯 ,例如,如果您創建一個將從服務器拉取數據的AsyncTask(請勿執行此操作),當您旋轉手機並再次重新創建活動時,AsyncTask將會重建。

服務

解決上述問題是因為它獨立於調用它的活動,因此即使在活動被銷毀時它也可以繼續運行, 它在主線程中運行(當心ANR)使用後台服務(擴展IntentService它會自動創建工作線程為你)服務就像一個沒有UI的活動 ,適合長時間的工作


簡而言之,針對time consuming tasks 服務 ,針對short-lived tasks time consuming tasks AsyncTask線程線程standard java construction


從開發者的角度來看:

線程 :用於執行設置以便與主線程並行編碼。 但是你不能處理線程內的UI。 為此你需要使用Handler 。 哈德勒像線程一樣工作,但也可以處理UI。

ASyncTask :用於處理那些無法在主線程上工作的任務。 例如,HTTP請求是非常繁重的工作,無法在主線程上處理,因此您在ASyncTask處理HTTP請求。它與您的主線程在後台中異步地並行工作。它沒有幾個回調方法在其上調用相應的事件。

服務 :是一個後台進程。 當你必須做一些沒有任何與之關聯的UI的處理時,它會被使用。


服務就像活動耗時很長的任務,但異步任務允許我們執行長/後台操作並在UI線程上顯示其結果,而無需操縱線程。


希望有人在幾天前告訴我的更多信息:

  • 您可以在活動和服務之間共享全局變量 - 例如線程。
  • 只要活動或服務仍然存在,您的應用程序及其所有全局變量就不會被清除。
  • 如果您的應用中有服務實例,並且操作系統需要資源,它首先會殺死您的活動,但只要存在服務,操作系統就不會將您的應用和其全局變量一起清除。

我的用例如下所示:我在全局空間中有一個連接到服務器的線程和一個顯示結果的Activity。 當用戶按下主頁按鈕時,活動進入後台並啟動新的服務。 然後,該服務從線程讀取結果,並在需要時在通知區域中顯示信息。 我不擔心操作系統會破壞我的Activity,因為我知道只要Service正在運行,它就不會銷毀該線程。


屏幕尺寸在Android是分為不同的類別ldpimdpihdpixhdpixxhdpixxxhdpi屏幕密度屏幕區域(如英寸)內的像素數量。通常,它以每英寸點數(dpi)為單位進行測量。

PX(Pixels):

  • 我們通常的標準像素映射到屏幕像素。px用於絕對像素。如果要根據寬度或高度的絕對像素給出,則使用此選項。不建議。

DP/DIP(Density pixels / Density independent pixels):

  • dip == dp。在之前的Android版本中,使用了dip,後來更改為dp。這是另一種選擇px

  • 通常我們從不使用,px因為它是絕對值。如果您使用px設置寬度或高度,並且該應用程序正在下載到不同屏幕大小的設備中,則該視圖將不會按照屏幕原始大小進行拉伸。

  • dp強烈建議用它代替px。使用dp,如果你想提的寬度和高度成長和基於屏幕尺寸縮小動態。

  • 如果我們給出dp/dip,android會根據160像素大小的屏幕自動計算像素大小。

SP(Scale independent pixels):

  • 根據用戶的字體大小首選項進行縮放。字體應該使用sp

  • 當提到適合各種屏幕尺寸的字體大小時,請使用sp。這是類似dp。用sp特別的字體大小以增長和縮小動態地根據屏幕尺寸

Android文檔說:

指定尺寸時,請始終使用其中一個dpsp單位。A dp是與密度無關的像素,其對應於160處的像素的物理尺寸dpi。An sp是相同的基本單位,但是按用戶首選的文本大小(它是與比例無關的像素)進行縮放,因此在定義文本大小時應使用此測量單位





android android-asynctask android-service java-threads