1. 程式人生 > >非同步操作之AsyncTask 和 Handler

非同步操作之AsyncTask 和 Handler

1、AsyncTask

AsyncTask是比Handler更輕量級的非同步處理方案,非同步的操作都是為了不阻塞主執行緒。

使用AsyncTask是通過繼承抽象類實現的:
public abstract class AsyncTask<Params, Progress, Result> 

其中定義了三種泛型型別:Params、Progress和Result。

。Params啟動任務執行的輸入引數
。Progress是後臺執行的百分比(在進度提示方面很有用)
。Result是後臺執行任務最終返回的結果

AsyncTask中提供的非同步操作的方法:

1、execute(Params... params)

:執行一個非同步任務,需要我們在程式碼中呼叫此方法,觸發非同步任務的執行。

2、onPreExecute():在execute(Params... params)被呼叫後立即執行,一般用來在執行後臺任務前對UI做一些標記,顯示進度對話方塊等。

3、doInBackground(Params... params):在onPreExecute()完成後立即執行,用於執行較為費時的操作,此方法將接收輸入引數和返回計算結果。在執行過程中可以呼叫publishProgress(Progress... values)來更新進度資訊。

4、onProgressUpdate(Progress... values)

:在呼叫publishProgress(Progress... values)時,此方法被執行,直接將進度資訊更新到UI元件上。

5、onPostExecute(Result result):當後臺操作結束時,此方法將會被呼叫,計算結果將做為引數傳遞到此方法中,直接將結果顯示到UI元件上。

6、onCancelled(X):當用戶呼叫取消時,執行的操作

使用AsyncTask類,必須遵守幾條規則:

。task的例項必須是在主執行緒中建立
。execute方法必須在主執行緒中呼叫
。不要手動呼叫onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法;
。task只能被執行一次,否則多次呼叫時將會出現異常

例項:

package vic.wong.main;
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * 生成該類的物件,並呼叫execute方法之後
 * 首先執行的是onProExecute方法
 * 其次執行doInBackgroup方法
 *
 */
public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {

	private TextView textView;
	private ProgressBar progressBar;
	
	
	public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
		super();
		this.textView = textView;
		this.progressBar = progressBar;
	}


	/**
	 * 這裡的Integer引數對應AsyncTask中的第一個引數 
	 * 這裡的String返回值對應AsyncTask的第三個引數
	 * 該方法並不執行在UI執行緒當中,主要用於非同步操作,所有在該方法中不能對UI當中的空間進行設定和修改
	 * 但是可以呼叫publishProgress方法觸發onProgressUpdate對UI進行操作
	 */
	@Override
	protected String doInBackground(Integer... params) {
		NetOperator netOperator = new NetOperator();
		int i = 0;
		for (i = 10; i <= 100; i+=10) {
			netOperator.operator();
			publishProgress(i);
		}
		return i + params[0].intValue() + "";
	}


	/**
	 * 這裡的String引數對應AsyncTask中的第三個引數(也就是接收doInBackground的返回值)
	 * 在doInBackground方法執行結束之後在執行,並且執行在UI執行緒當中 可以對UI空間進行設定
	 */
	@Override
	protected void onPostExecute(String result) {
		textView.setText("非同步操作執行結束" + result);
	}


	//該方法執行在UI執行緒當中,並且執行在UI執行緒當中 可以對UI空間進行設定
	@Override
	protected void onPreExecute() {
		textView.setText("開始執行非同步執行緒");
	}


	/**
	 * 這裡的Intege引數對應AsyncTask中的第二個引數
	 * 在doInBackground方法當中,,每次呼叫publishProgress方法都會觸發onProgressUpdate執行
	 * onProgressUpdate是在UI執行緒中執行,所有可以對UI空間進行操作
	 */
	@Override
	protected void onProgressUpdate(Integer... values) {
		int vlaue = values[0];
		progressBar.setProgress(vlaue);
	}
}

2、Handler

AsyncTask

相關推薦

非同步操作AsyncTask Handler

1、AsyncTask AsyncTask是比Handler更輕量級的非同步處理方案,非同步的操作都是為了不阻塞主執行緒。 使用AsyncTask是通過繼承抽象類實現的:public abstract class AsyncTask<Params, Progress,

Android——AsyncTaskHandler對比

AsyncTask和Handler對比 1 ) AsyncTask實現的原理,和適用的優缺點 AsyncTask,是android提供的輕量級的非同步類,可以直接繼承AsyncTask,在類中實現非同步操作,並提供介面反饋當前非同步執行的程度(可以通過介面實現UI進度更

AsyncTaskHandler非同步執行緒之間的區別

當應用程式啟動時,Android首先會開啟一個主執行緒, 主執行緒為管理介面中的UI控制元件,進行事件分發,更新UI只能在主執行緒中更新,子執行緒中操作是危險的。這個時候,Handler就需要出來解決這個複雜的問題。由於Handler執行在主執行緒中(UI執行緒中),它與子執行緒可以通過Message物件來傳

Hadoop IO操作SequenceFile MapFile

直接 修改 head ati rec key 情況 接口 用戶 一、SquenceFile   文件中每條記錄是可序列化,可持久化的鍵值對,提供相應的讀寫器和排序器,寫操作根據壓縮的類型分為3種。   ---Write 無壓縮寫數據  ---RecordCompressWr

(轉)python selenium-webdriver 元素操作滑鼠鍵盤事件

參考資料:https://blog.csdn.net/zh175578809/article/details/76767748 參考資料2:https://blog.csdn.net/qq_41817302/article/details/79618654   selenium 提供了比較完整的鍵盤操作,

Java+Selenium3方法篇14-元素操作輸入點選

       前面文章介紹完了driver的一些常見的瀏覽器設定和查詢元素的介面,接下來,我們找到了元素,是為了去操作元素。這篇介紹元素操作常見方法中的,給元素寫入一個字串,和點選元素。一般來講,給元素輸入一個字串,這樣的元素,一般是可以輸入文字,基本上是inputbox這

java8流式操作對映拍排序

對映分為 map和 flaterMap兩個 map: 介面一個lambda,將元素轉換成其他心事或提取資訊,即接收一個函式座位引數,該函式會被應用到每個元素上,冰將其對映成一個新的元素 flaterMap-- 接收一個函式作為引數,將流中的每個值都換成流另外一個流,然後把所有的流都連城一

簡要介紹一下asynctaskhandler的優缺點

1 ) AsyncTask實現的原理,和適用的優缺點 AsyncTask,是android提供的輕量級的非同步類,可以直接繼承AsyncTask,在類中實現非同步操作,並提供介面反饋當前非同步執行的程度(可以通過介面實現UI進度更新),最後反饋執行的結果給UI主執行緒. 使

AsyncTaskHandler對比

AsyncTask和Handler對比 1 ) AsyncTask實現的原理,和適用的優缺點 AsyncTask,是android提供的輕量級的非同步類,可以直接繼承AsyncTask,在類中實現

AsyncTaskHandler的優缺點比較

當應用程式啟動時,Android首先會開啟一個主執行緒, 主執行緒為管理介面中的UI控制元件,進行事件分發,更新UI只能在主執行緒中更新,子執行緒中操作是危險的。這個時候,Handler就需要出來解決這個複雜的問題。由於Handler執行在主執行緒中(UI執行緒中),它與子執行緒可以通過Message物件來

網路連線Http及非同步操作AsyncTask

      Http個人理解為是基於請求、響應,無狀態,應用層的超文字傳輸協議。其特點有:支援客戶端與伺服器之間互動模式;簡單快捷;靈活;無連線;無狀態。       Http介紹:HTTP是一個屬於應用層的面向物件的協議,由於其簡捷、快速的方式,適用於分散式超媒體資訊系

C/C++ 文件操作CreateFile、ReadFileWriteFile

amp 列表 invalid bsp 功能 空間 out 系統 file 通常使用下列函數來通過Win系統來對外圍設備進行通信處理: ------------------------------- 1. CreateFile   這個函數的功能是創建或者打開一個文件或者I/

jQuery的DOM操作設置獲取HTML、文本值 html()text()val()

java fontsize doc .text cti checkbox .net mar jsb 1. html()方法: 此方法類似於JavaScript中的innerHTML屬性,可以用來讀取或者設置某個元素中的html內容。 <html> <h

數據庫 操作(DDL語句)索引

數據庫 表操作 1 概述表是一種很重要的數據庫對象,是組成數據庫的基本元素,由若幹個字段組成。主要用來存儲數據記錄。表的操作,包含創建表、刪除表、修改表等。給表中的字段創建索引,將提高查詢的速度。表的操作涉及DDL: DataDefinationLanguage,數據定義語言,關鍵字:CREATE,

Go基礎--排序查找操作

ear () ola 方法 math https swa blog png 排序操作主要都在sort包中,導入就可以使用了import("sort") 常用的操作 sort.Ints:對整數進行排序sort.Strings:對字符串進行排序sort.Float64s:對

redis操作叠代器(scanhscan)講解

edi 服務器 cursor redis scan 模式 att 情況 叠代器 當我們需要遍歷Redis所有key或者指定模式的key時,首先想到的是KEYS命令,但是如果redis數據非常大,並且key也非常多的情況下,查詢的時候很可能會很慢,造成整個redis阻塞,那麽

Flask中數據庫框架模型類四:再述SQLAlchemy配置基本操作增刪改查

模糊 offset odi com app ack 字符 add () from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) #設置連接數據庫的URL

Python學習筆記字符串操作isalpha()、isalnum()、isdecimal()、isspace()istitle()方法

itl brush .com light supper isalnum 如果 小寫 分割 隨筆記錄方便自己和同路人查閱。 #------------------------------------------------我是可恥的分割線------------------

Python學習筆記字符串操作rjust()、ljust()icenter()方法對齊文本

字符串操作 int 圖片 方法 spa -c enter ice 第一個 隨筆記錄方便自己和同路人查閱。 #------------------------------------------------我是可恥的分割線--------------------------

scrapy框架cookie代理操作

一,scrapy傳送post請求 scrapy框架中預設傳送的是get請求,原始碼: scrapy.Spider父類中的start_request方法: def start_requests(self): cls = self.__class__ if