1. 程式人生 > >Android基礎之AsyncTask的doInBackground方法引數詳解

Android基礎之AsyncTask的doInBackground方法引數詳解

1、對於耗時的操作,我們的一般方法是開啟“子執行緒”。如果需要更新UI,則需要使用handler

2、如果耗時的操作太多,那麼我們需要開啟太多的子執行緒,這就會給系統帶來巨大的負擔,隨之也會帶來效能方面的問題。在這種情況下我們就可以考慮使用類AsyncTask來非同步執行任務,不需要子執行緒和handler,就可以完成非同步操作和重新整理UI。

3、AsyncTask:對執行緒間的通訊做了包裝,是後臺執行緒和UI執行緒可以簡易通訊:後臺執行緒執行非同步任務,將result告知UI執行緒。

4、使用方法:共分為兩步,自定義AsyncTask,在耗時的地方呼叫自定義的AsyncTask。可以參照以下程式碼示例。

step1:繼承AsyncTask<Params,Progress,Result>

           Params:輸入引數。對應的是呼叫自定義的AsyncTask的類中呼叫excute()方法中傳遞的引數。如果不需要傳遞引數,則直接設為Void即可。

           Progress:子執行緒執行的百分比

           Result:返回值型別。和doInBackground()方法的返回值型別保持一致。

step2:實現以下幾個方法:執行時機和作用看示例程式碼,以下對返回值型別和引數進行說明

          onPreExecute():無返回值型別。不傳引數

          doInBackground(Params... params):返回值型別和Result保持一致。引數:若無就傳遞Void;若有,就可用Params

          publishProgress(Params... params):在執行此方法的時候會直接呼叫onProgressUpdate(Params... values)

          onProgressUpdate(Params... values):無返回值型別。引數:若無就傳遞Void;若有,就可用Progress

          onPostExecute(Result  result) :無返回值型別。引數:和Result

保持一致。

step3:在呼叫自定義的AsyncTask類中生成物件;

          執行  :物件.excute(Params... params);

小注:

   1) Task的例項必須在UI thread中建立     2) execute方法必須在UI thread中呼叫     3) 不要手動的呼叫onPreExecute(), onPostExecute(Result),doInBackground=\'#\'" onProgressUpdate(Progress...)這幾個方法     4) 該task只能被執行一次,否則多次呼叫時將會出現異常

示例程式碼:

複製程式碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView    
       android:layout_width="fill_parent"   
       android:layout_height="wrap_content"   
       android:text="Hello , Welcome to Andy's Blog!"/>  
    <Button  
       android:id="@+id/download"  
       android:layout_width="fill_parent"  
       android:layout_height="wrap_content"  
       android:text="Download"/>  
    <TextView    
       android:id="@+id/tv"  
       android:layout_width="fill_parent"   
       android:layout_height="wrap_content"   
       android:text="當前進度顯示"/>  
    <ProgressBar  
       android:id="@+id/pb"  
       android:layout_width="fill_parent"  
       android:layout_height="wrap_content"  
       style="?android:attr/progressBarStyleHorizontal"/>  
</LinearLayout>
複製程式碼 複製程式碼
package sn.demo;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;

public class DownloadTask extends AsyncTask<Integer, Integer, String> {
    //後面尖括號內分別是引數(執行緒休息時間),進度(publishProgress用到),返回值 型別  
    
    private Context mContext=null;
    private ProgressBar mProgressBar=null;
    private TextView mTextView=null;
    public DownloadTask(Context context,ProgressBar pb,TextView tv){
        this.mContext=context;
        this.mProgressBar=pb;
        this.mTextView=tv;
    }
    /*
     * 第一個執行的方法
     * 執行時機:在執行實際的後臺操作前,被UI 執行緒呼叫
     * 作用:可以在該方法中做一些準備工作,如在介面上顯示一個進度條,或者一些控制元件的例項化,這個方法可以不用實現。
     * @see android.os.AsyncTask#onPreExecute()
     */
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        Log.d("sn", "00000");
        super.onPreExecute();
    }
    
    /*
     * 執行時機:在onPreExecute 方法執行後馬上執行,該方法執行在後臺執行緒中
     * 作用:主要負責執行那些很耗時的後臺處理工作。可以呼叫 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。
     * @see android.os.AsyncTask#doInBackground(Params[])
     */
    @Override
    protected String doInBackground(Integer... params) {
        // TODO Auto-generated method stub
        Log.d("sn", "1111111");
        for(int i=0;i<=100;i++){
            mProgressBar.setProgress(i);
            publishProgress(i);
            try {
                Thread.sleep(params[0]);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return "執行完畢";
    }

    /*
     * 執行時機:這個函式在doInBackground呼叫publishProgress時被呼叫後,UI 執行緒將呼叫這個方法.雖然此方法只有一個引數,但此引數是一個數組,可以用values[i]來呼叫
     * 作用:在介面上展示任務的進展情況,例如通過一個進度條進行展示。此例項中,該方法會被執行100次
     * @see android.os.AsyncTask#onProgressUpdate(Progress[])
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        Log.d("sn", "2222222222");
        mTextView.setText(values[0]+"%");
        super.onProgressUpdate(values);
    }
    
    /*
     * 執行時機:在doInBackground 執行完成後,將被UI 執行緒呼叫
     * 作用:後臺的計算結果將通過該方法傳遞到UI 執行緒,並且在介面上展示給使用者
     * result:上面doInBackground執行後的返回值,所以這裡是"執行完畢"  
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     */
    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        Log.d("sn", "3333333333");
        
        super.onPostExecute(result);
    }




}
複製程式碼 複製程式碼
package sn.demo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class AsyncTaskDemoActivity extends Activity {
    /** Called when the activity is first created. */
    private Button download;
    private TextView tv;
    private ProgressBar pb;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        initView();
    }
    private void initView() {
        // TODO Auto-generated method stub
        tv=(TextView)findViewById(R.id.tv);
        pb=(ProgressBar)findViewById(R.id.pb);
        download=(Button)findViewById(R.id.download);
        download.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                DownloadTask dt=new DownloadTask(AsyncTaskDemoActivity.this,pb,tv);
                dt.execute(100);
            }
        });
    }
}
複製程式碼

參照連線

http://blog.csdn.net/cjjky/article/details/6684959

http://blog.csdn.net/zhenyongyuan123/article/details/5850389

http://www.eoeandroid.com/thread-102664-1-1.html

相關推薦

Android基礎ListView的使用

今天給大家帶來《android應用開發全程實錄》中關於listview和adatper中的部分。包括listview的基本使用,listview的優化等。 我們經常會在應用程式中使用列表的形式來展現一些內容,所以學好ListView是非常必需的。ListView也是Android中比較難以使用的控制元件,這

Android基礎AsyncTask的doInBackground方法引數

1、對於耗時的操作,我們的一般方法是開啟“子執行緒”。如果需要更新UI,則需要使用handler 2、如果耗時的操作太多,那麼我們需要開啟太多的子執行緒,這就會給系統帶來巨大的負擔,隨之也會帶來效能方面的問題。在這種情況下我們就可以考慮使用類AsyncTask來非同步執行任務,不需要子執行緒和handler

C#基礎流程控制語句

集合 必須 清晰 循環 remove 很難 使用 fault code C#程序的執行都是一行接一行、自上而下地進行,不遺漏任何代碼。為了讓程序能按照開發者所設計的流程進行執行,必然需要進行條件判斷、循環和跳轉等過程,這就需要實現流程控制。C#中的流程控制包含了條件語句、循

android 繪圖Path與Paint[轉]

/** * Paint類介紹 * * Paint即畫筆,在繪圖過程中起到了極其重要的作用,畫筆主要儲存了顏色, * 樣式等繪製資訊,指定了如何繪製文字和圖形,畫筆物件有很多設定方法, * 大體上可以分為兩類,一類與圖形繪製相關,一類與文字繪製相關。 * * * 1.圖形繪製 * setARG

Window.open()方法引數

1, 最基本的彈出視窗程式碼    window.open('page.html'); 2, 經過設定後的彈出視窗    window.open('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menub

Window.open()方法引數開啟新視窗

http://www.cnblogs.com/sofiawang/articles/1544631.html 1, 最基本的彈出視窗程式碼    window.open('page.html');2, 經過設定後的彈出視窗   window.open('page.html'

Java 基礎 static 修飾符

        static修飾成員不能訪問沒有static修飾的成員,因為static修飾的成員是所有物件所共有的,也就是屬於這個類,所以在沒有例項化任何一個物件的時候就可以用類來訪問這個靜態屬性, 同時,任何一個物件都可以訪問修改這個靜態屬性,比如:一個靜態方法,它不可以

Android集合SparseArray、ArrayMap

前言 作為一個Anndroid開發人員來說,我們大多數情況下時使用的Java語言,自然在一些資料的處理時,使用到的集合框架也是Java的,比如HashMap、HashSet等,但是你可否知道,Android因為自身特殊的需求,也為自己量身定製了“專屬”的集合類,查閱官方文件,android.ut

Android開發JSON資料解析(二)

在上一篇我們講解了Android開發JSON的基本介紹以及JSON的資料結構等, 今天我們來講解一下JSON的工作原理以及基本用法: JSON解析分為兩種情況,一種是在伺服器端解析,另一種是在客戶端解析 第一種:在伺服器段解析:    通常,客戶端在請求伺服器資料時,伺服器

Android學習主題樣式開發

本文和大家分享的主要是android開發主題樣式相關內容,一起來看看吧,希望對大家學習和使用這部分內容有所幫助。   app如何設定主題   1. 在res/values/styles.xml檔案中新增程式碼:   2. 在

Jquery.ocupload 一鍵上傳技術方法引數(中文翻譯)(一鍵上傳新手入門)

http://code.google.com/p/ocupload/ Jquery.ocupload 一鍵上傳官網重點內容 官方文件案例 Example var myUpload = $(element).upload({ name:

Android開發Scroller的使用

其實關於Scroller這篇文章我早就想寫了,起初是因為看Xlistview的原始碼,接觸到了Scroller的使用,之後又在網上讀了大量的文章,之後自己寫了一個demo,對scroller也算是有了自己的看法。 我學習的道路是曲折的,所以我要把我會的東西寫出來,說不定對別

canvas的drawImage方法引數

HTML5中引入新的元素canvas,其drawImage 方法允許在 canvas 中插入其他影象( img 和 canvas 元素) 。drawImage函式有三種函式原型: drawImage(image, dx, dy)  drawImage(image, d

Python3.5——內建方法引數

Python的內建方法引數詳解網站為:https://docs.python.org/3/library/functions.html?highlight=built#ascii 1、abs(x):返回一個數字的絕對值。引數可以是整數或浮點數。如果引數是一個複數,則返回它的

log4jlog4j.properties引數(log4j各個配置引數含義)

====>log4j之log4j.properties引數詳解 ====>log4j介紹: Log4j是Apache的一個開源專案,通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件,甚至是套介面伺服器、NT的事件

JQuery中$.ajax()方法引數

轉載來自:http://blog.sina.com.cn/s/blog_4f925fc30100la36.html url: 要求為String型別的引數,(預設為當前頁地址)傳送請求的地址。type: 要求為String型別的引數,請求方式(post或get)預設為ge

$.ajax()方法引數

1.url: 要求為String型別的引數,(預設為當前頁地址)傳送請求的地址。2.type: 要求為String型別的引數,請求方式(post或get)預設為get。注意其他http請求方法,例如put和delete也可以使用,但僅部分瀏覽器支援。3.timeout: 要求

Android基礎四大元件-Service

1 介紹   Service是android的一種機制。Service是執行在後臺的程式碼,不能與使用者互動,可以執行在自己的程序,也可以執行在其他應用程式的上下文裡。需要通過某一個Activity或其他Context物件來呼叫。 1.1 Servic

Android基礎————UI佈局UI美化分解

UI美化 (1)color資源: 1、values的color常量: 引用方式:@color/xxx 1. 設定字型的顏色 android:textColor="@color/white" 2. 設定佈局的背景顏色 android:background

解決ajax跨域的方法原理Cors方法

詳細 不同 htm 渲染 jsonp del 需要 methods href 1、神馬是跨域(Cross Domain) 對於端口和協議的不同,只能通過後臺來解決。 一句話:同一個ip、同一個網絡協議、同一個端口,三者都滿足就是同一個域,否則就是 跨域問題了。而為