您現在的位置是:電腦技術吧?>? 故障問題 ??>??Android多線程,Android開發多線程??>??正文詳情

Android多線程,Android開發多線程

闞融雪2019-12-09 11:01:57 人圍觀
簡介android多線程同步Asynctask Asynctask是一個異步任務,可以執行簡單的異步操作,并將執行結果發布到UI主線程。Asynctask是一個抽象類。實際上,它結合了線程android多線程下載

AsyncTask  AsyncTask,異步任務,可以簡單進行異步操作,并把執行結果發布到UI主線程。

AsyncTask是一個抽象類,它的內部其實也是結合了Thread和Handler來實現異步線程操作,但是它形成了一個通用線程框架,更清晰簡單。

AsyncTask應該被用于比較簡短的操作(最多幾秒鐘)。

如果需要保持長時間運行的線程,可以使用ThreadPooExecutor或者FutureTask,關于這兩個類的內容,以后再介紹,本片博客主要介紹AsyncTask。

  AsyncTask被定義為一個操作,運行在一個后臺線程中,其結果被發布在UI線程上。

它的異步工作的參數與返回值被泛型的三個參數指定:Params、Progress、Result。

AsyncTask將經歷4個步驟:onPreExecute、doInBackground、onProgressUpdate、onPostExecute。

下面詳細講解這三個參數與四個步驟:  三個泛型參數: Params:被發送到執行任務的參數類型。

Progress:進度的類型,發送后臺的計算進度到UI線程類型。

Result:異步任務的返回結果類型。

  一個異步任務將經歷四個階段: onPreExecute():執行在UI線程上調用執行任務之前,一般用于設置任務。

doInBackground(Params...):主要是用來執行異步任務的耗時操作,可以在這個方法中通過publishProgress()方法發布進度信息,并在執行完成之后,返回執行結果。

onProgreddUpdate(Progress...):在UI線程上接受doInBackground()傳遞過來的進度信息,并在UI線程上展示進度信息,它執行的時機是不確定的。

onPostExecute(Result):在UI線程上操作doInBackground()執行的返回值。

  上面介紹的四個步驟的示意圖:

Android:多線程之AsyncTask 電腦高手

AsyncTask取消任務  在程序的任何位置,都可以通過cancel(boolean)方法進行取消任務,當取消任務之后,會改變isCancelled()的返回值,使其返回true。

之后會調用onCancelled(Object)方法,替代onPostExecute()得到doInBackground()的返回結果。

在運行中,可以經常通過isCancelled()方法查看任務是否被取消。

AsyncTask的使用規則  使用AsyncTask必須遵循以下規則: AsyncTask必須聲明在UI線程上。

AsyncTask必須在UI線程上實例化。

必須通過execute()方法執行任務。

不可以直接調用onPreExecute()、onPostExecute(Resut)、doInBackground(Params...)、onProgressUpdate(Progress...)方法。

可以設置任務只執行一次,如果企圖再次執行會報錯。

示例  一個簡單的示例,通過AsyncTask下載一個網絡上的圖片,下載的時候展示一個等待框,并顯示在一個ImageView中。

  實現代碼: 1 package com.bgxt.datatimepickerdemo; 2 3 import org.apache.http.HttpEntity; 4 import org.apache.http.HttpResponse; 5 import org.apache.http.client.HttpClient; 6 import org.apache.http.client.methods.HttpGet; 7 import org.apache.http.impl.client.DefaultHttpClient; 8 import org.apache.http.util.EntityUtils; 9 10 import android.app.Activity;11 import android.app.ProgressDialog;12 import android.graphics.Bitmap;13 import android.graphics.BitmapFactory;14 import android.os.AsyncTask;15 import android.os.Bundle;16 import android.view.View;17 import android.widget.Button;18 import android.widget.ImageView;19 20 public class AsyncTaskActivity1 extends Activity {21 private Button btnDown;22 private ImageView ivImage;23 private static String image_path = http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg;24 private ProgressDialog dialog;25 26 @Override27 protected void onCreate(Bundle savedInstanceState) {28 // TODO Auto-generated method stub29 super.onCreate(savedInstanceState);30 setContentView(R.layout.asynctask_activity);31 32 btnDown = (Button) findViewById(R.id.btnDown);33 ivImage = (ImageView) findViewById(R.id.ivSinaImage);34 35 // 聲明一個等待框以提示用戶等待36 dialog=new ProgressDialog(this);37 dialog.setTitle(提示信息);38 dialog.setMessage(正在下載,請稍后...);39 40 btnDown.setOnClickListener(new View.OnClickListener() {41 42 @Override43 public void onClick(View v) {44 // 執行一個異步任務,并把圖片地址以參數的形式傳遞進去45 new MyTask().execute(image_path);46 }47 });48 }49 50 // 以String類型的參數,Void表示沒有進度信息,Bitmap表示異步任務返回一個位圖51 public class MyTask extends AsyncTaskString, Void, Bitmap {52 // 表示任務執行之前的操作53 @Override54 protected void onPreExecute() {55 super.onPreExecute();56 //顯示等待框57 dialog.show();58 }59 60 //主要是完成耗時操作61 @Override62 protected Bitmap doInBackground(String... params) {63 HttpClient httpClient=new DefaultHttpClient();64 HttpGet httpGet=new HttpGet(params[0]);65 Bitmap bitmap=null;66 try {67 //從網絡上下載圖片68 HttpResponse httpResponse =httpClient.execute(httpGet);69 if(httpResponse.getStatusLine().getStatusCode()==200){70 HttpEntity httpEntity = httpResponse.getEntity();71 byte[] data=EntityUtils.toByteArray(httpEntity);72 bitmap=BitmapFactory.decodeByteArray(data, 0, data.length); 73 }74 } catch (Exception e) {75 e.printStackTrace();76 }77 return bitmap;78 }79 80 //完成更新UI操作81 @Override82 protected void onPostExecute(Bitmap result) {83 // TODO Auto-generated method stub84 super.onPostExecute(result);85 //設置ImageView的顯示圖片86 ivImage.setImageBitmap(result);87 // 銷毀等待框88 dialog.dismiss();89 }90 91 }92 }  效果展示:

    上面的Demo并沒有用到進度的信息,下面再提供一個完整的AsyncTask的Demo,同樣是下載一個圖片,并且展示到一個ImageView中,但是這里在下載的過程中增加一個進度條對話框,用于展示下載的進度。

  實現代碼: 1 package com.bgxt.datatimepickerdemo; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.InputStream; 5 6 import org.apache.http.HttpResponse; 7 import org.apache.http.client.HttpClient; 8 import org.apache.http.client.methods.HttpGet; 9 import org.apache.http.impl.client.DefaultHttpClient; 10 11 import android.app.Activity; 12 import android.app.ProgressDialog; 13 import android.graphics.Bitmap; 14 import android.graphics.BitmapFactory; 15 import android.os.AsyncTask; 16 import android.os.Bundle; 17 import android.view.View; 18 import android.widget.Button; 19 import android.widget.ImageView; 20 21 public class AsyncTaskActivity2 extends Activity { 22 private Button btnDown; 23 private ImageView ivImage; 24 private static String image_path = http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg; 25 private ProgressDialog dialog; 26 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 setContentView(R.layout.asynctask_activity); 31 btnDown = (Button) findViewById(R.id.btnDown); 32 ivImage = (ImageView) findViewById(R.id.ivSinaImage); 33 34 dialog = new ProgressDialog(this); 35 dialog.setTitle(提示); 36 dialog.setMessage(正在下載,請稍后...); 37 dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 38 dialog.setCancelable(false); 39 40 btnDown.setOnClickListener(new View.OnClickListener() { 41 42 @Override 43 public void onClick(View v) { 44 // 執行異步任務 45 new MyTask().execute(image_path); 46 } 47 }); 48 } 49 50 public class MyTask extends AsyncTaskString, Integer, Bitmap { 51 @Override 52 protected void onPreExecute() { 53 super.onPreExecute(); 54 dialog.show(); 55 } 56 57 @Override 58 protected void onProgressUpdate(Integer... values) { 59 super.onProgressUpdate(values); 60 // 設置進度對話框的進度值 61 dialog.setProgress(values[0]); 62 } 63 64 @Override 65 protected void onPostExecute(Bitmap result) { 66 super.onPostExecute(result); 67 dialog.dismiss(); 68 ivImage.setImageBitmap(result); 69 } 70 71 @Override 72 protected Bitmap doInBackground(String... params) { 73 Bitmap bitmap = null; 74 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 75 InputStream inputStream = null; 76 try { 77 HttpClient httpClient = new DefaultHttpClient(); 78 HttpGet httpGet = new HttpGet(params[0]); 79 HttpResponse httpResponse = httpClient.execute(httpGet); 80 if (httpResponse.getStatusLine().getStatusCode() == 200) { 81 inputStream = httpResponse.getEntity().getContent(); 82 long file_length = httpResponse.getEntity() 83 .getContentLength(); 84 int len = 0; 85 byte[] data = new byte[1024]; 86 int total_length = 0; 87 // 以字節的方式讀取圖片數據 88 while ((len = inputStream.read(data)) != -1) { 89 total_length = len; 90 // 計算進度 91 int values = (int) ((total_length / (float) file_length) * 100); 92 // 發布進度信息 93 publishProgress(values); 94 outputStream.write(data, 0, len); 95 } 96 byte[] result=outputStream.toByteArray(); 97 bitmap=BitmapFactory.decodeByteArray(result, 0, result.length); 98 } 99 } catch (Exception e) {100 e.printStackTrace();101 } finally {102 try {103 if (inputStream != null) {104 inputStream.close();105 }106 } catch (Exception e2) {107 }108 }109 return bitmap;110 }111 }112 }  實現效果:

版權聲明:本文由 闞融雪 整理編輯。

原標題:android什么時候用到多線程,Android 多線程并發

轉載注明出處:http://www.dn9ww09s.icu/fault/15261.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • windows10安裝,win7安裝

    windows10安裝,win7安裝 相關圖片win7系統安裝使用自動安裝程序自動安裝MySQL新MySQL 5.0用戶可以使用MySQL安裝向導和MySQL配置向導在windows上安裝MySQL。這兩個向導的目的是方便怎么安裝win7系統...

  • webconfig在哪,webconfig怎么打開

    webconfig在哪,webconfig怎么打開 相關圖片webconfig文件不能用于一。修改IIS工作流程的最大數量。請考慮以下要點:1。每個工作進程都會消耗系統資源和CPU利用率,過多的工作進程會導致系統資源和CPU利用率的急劇消耗。每個工...

  • jsp response,jspresponse對象

    jsp response,jspresponse對象 相關圖片response最近,我們在做一個項目時遇到了一個問題。回應。Sendredirect()已添加,系統也已執行,但它只是沒有跳轉。最后,我們在網上發現了以下原因:首先,我們需要request與respons...

  • 獲取url參數,如何獲取url后面參數

    獲取url參數,如何獲取url后面參數 相關圖片前端獲取url參數Get URL including參數函數名:geturl role:Get URL including參數返回值:Get URL including參數'**url參數...

  • 建立網站的方式,怎么建立網站

    建立網站的方式,怎么建立網站 相關圖片網絡推廣方法 網站發布JSP網站最靈活的方法之一是將它配置到Tomcat目錄下的文件中,并在其主機標記中創建一個新的上下文標記來部署JSP應用程序。如果我們在這里部署它,那么我們網...

  • 如何去水印,水印

    如何去水印,水印 相關圖片微博水印設置叫水來?JPEG(filenameb)調用aspjpeg組件生成小縮略圖?JPEG(filenameb,filenames)設置JPEG=server.crea微博水印怎么去掉...

  • IP代碼,查看IP代碼

    IP代碼,查看IP代碼 相關圖片當前IP地址PHP代碼如果GetType=0,則獲取用戶的實際IP地址代碼公共函數getip(GetType),如果網站統計ip代碼...

  • 總結中國元素,總結一些其他中國元素

    總結中國元素,總結一些其他中國元素 相關圖片元素化合物知識總結SP comment%--*****-%是注釋字符。instruction元素instruction元素用于指定有關網頁本身的信息。例如:%@page cont元素周期表規律總結...

  • 什么是存儲過程,exec 存儲過程

    什么是存儲過程,exec 存儲過程 相關圖片存儲過程的創建對于輸入輸出的存儲過程,請參見以下存儲過程:/*SP2*/create procedure dbo.deleterall as set NOCOUNT on b存儲過程怎么創建...

  • asp 代碼,asp開源代碼

    asp 代碼,asp開源代碼 相關圖片怎樣將asp源代碼函數GetSonID(ParentID)G_sql=Select*From Select_Class ParentID=int(ParentID)Set Srs什么是asp...

熱評文章

  • ASP,ASP是啥

    ASP,ASP是啥 相關圖片ASP技術方法如下:程序代碼%dim arr:set arr=new arraylistarr.add A:arr.add B:arr.add cressponse.wrASP模式...

  • excel編程有什么用,excel編程可以做什么

    excel編程有什么用,excel編程可以做什么 相關圖片excel編程語言Excel是一個優秀的電子表格軟件。如果您的程序需要以報告的形式顯示最終結果,這將是一個不錯的選擇。通過VB可以控制Excel顯示數據表。如果不想了解更多有關Eexcel編程計...

  • 復雜對象,對象與別人關系復雜的說說

    復雜對象,對象與別人關系復雜的說說 相關圖片get請求傳遞復雜對象介紹了Aidl傳輸復雜類型對象的特殊處理方法。通過進程間的Aidl接口傳輸系統允許的數據并不容易。如果需要傳輸復雜類型的對象,則需要進行一些額外的處理。如下...

  • mysql query,mysql_query失敗

    mysql query,mysql_query失敗 相關圖片mysql_query返回值PHP MySQL data seek()函數定義并使用MySQL data seek()函數將指針移動到內部結果。syntax MySQL[data]seeksql query...

  • 一鍵備份還原,電腦備份怎么還原

    一鍵備份還原,電腦備份怎么還原 相關圖片手機備份還原導入和導出涉及兩個命令:source和MySQL dump:1。導入:輸入MySQL命令行,輸入任何要導入的數據庫,然后導入。具體命令如下:進入windows的ghost備份還原...

  • EXIF信息,信息

    EXIF信息,信息 相關圖片android 圖片框架什么是EXIF?首先讓我們了解什么是EXIF。EXIF是一種圖像文件格式。它以JPEG格式存儲的數據完全相同。實際上,EXIF格式是JPEG格式,頭部插入數字照android長圖片處理...

  • 溫馨提示的意義,月度總結的目的和意義

    溫馨提示的意義,月度總結的目的和意義 相關圖片理論提示有哪些方法Microsoft VBScript語法錯誤(0800a03e9)>內存不足Microsoft VBScript語法錯誤(0800a03ea)>語法錯誤Micr對甲亢有提示意義的...

  • 2~7長度的中英文字符是多少,中英文字符

    2~7長度的中英文字符是多少,中英文字符 相關圖片中英文字符的名字函數strleng(str)ON ERROR RESUME NEXT dim WINNT_CHINESE WINNT_CHINESE=(len(論壇)=2)如W2到7位的中文字符或字母...

  • 2c,8c

    2c,8c 相關圖片1c抽象類和接口是面向對象編程中的兩個概念,但是研究編程多年的程序員有時并沒有明確的區別。下面解釋抽象類和接口的概念和區別。抽象類c點...

  • XXLive,X-

    XXLive,X- 相關圖片x y這個例子運行在MySQL 5.0和更高版本上。MySQL給用戶權限命令的簡單格式可以概括為:向用戶1授予對數據庫對象的權限,向普通數據用戶授予查詢、插入、更新和e^x...

關注微信

变脸官网查询