android 兩種異步進程ProgressDialog的顯示效果。

android 兩種異步進程ProgressDialog的顯示效果。

  1. AsyncTask
  2. new Thread(new Runnable()

    • 文章可能不太嚴謹 僅作存檔。

AsyncTask

  • 背景
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {  
    ……  
}  

標準形式(簡單解釋)如果需要詳細連接請參考下面兩位大神的博客。
- http://blog.csdn.net/liuhe688/article/details/6532519
- http://blog.csdn.net/guolin_blog/article/details/11711405
1. Params
在執行AsyncTask時需要傳入的參數,可用於在後臺任務中使用。
2. Progress
後臺任務執行時,如果需要在界面上顯示當前的進度,則使用這裏指定的泛型作爲進度單位。
3. Result
當任務執行完畢後,如果需要對結果進行返回,則使用這裏指定的泛型作爲返回值類型。

這裏我們把AsyncTask的第一個泛型參數指定爲Void,表示在執行AsyncTask的時候不需要傳入參數給後臺任務。第二個泛型參數指定爲Integer,表示使用整型數據來作爲進度顯示單位。第三個泛型參數指定爲Boolean,則表示使用布爾型數據來反饋執行結果。
1. onPreExecute()
這個方法會在後臺任務開始執行之間調用,用於進行一些界面上的初始化操作,比如顯示一個進度條對話框等。
2. doInBackground(Params…)
這個方法中的所有代碼都會在子線程中運行,我們應該在這裏去處理所有的耗時任務。任務一旦完成就可以通過return語句來將任務的執行結果進行返回,如果AsyncTask的第三個泛型參數指定的是Void,就可以不返回任務執行結果。注意,在這個方法中是不可以進行UI操作的,如果需要更新UI元素,比如說反饋當前任務的執行進度,可以調用publishProgress(Progress…)方法來完成。
3. onProgressUpdate(Progress…)
當在後臺任務中調用了publishProgress(Progress…)方法後,這個方法就很快會被調用,方法中攜帶的參數就是在後臺任務中傳遞過來的。在這個方法中可以對UI進行操作,利用參數中的數值就可以對界面元素進行相應的更新。
4. onPostExecute(Result)
當後臺任務執行完畢並通過return語句進行返回時,這個方法就很快會被調用。返回的數據會作爲參數傳遞到此方法中,可以利用返回的數據來進行一些UI操作,比如說提醒任務執行的結果,以及關閉掉進度條對話框等。

下面代碼就是我的簡單試用,看源碼很簡單(僅作存檔)

package com.android.ui;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

    private Button button;
    private ProgressDialog pd;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pd = new ProgressDialog(this);
        pd .setCancelable(false);
        button = (Button) findViewById(R.id.button1);

        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                /* 顯示ProgressDialog */
                pd = ProgressDialog.show(MainActivity.this, "標題", "加載中,請稍後……");

                /* 開啓一個新線程,在新線程裏執行耗時的方法 */
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        spandTimeMethod();// 耗時的方法
                        handler.sendEmptyMessage(0);// 執行耗時的方法之後發送消給handler
                    }

                }).start();
            }
        });

    }

    private void spandTimeMethod() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {// handler接收到消息後就會執行此方法
            pd.dismiss();// 關閉ProgressDialog
        }
    };
}

第二種 更簡單 看代碼就能看懂

package com.android.ui;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

    private Button button;
    private ProgressDialog pd;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        button = (Button) findViewById(R.id.button1);
        pd = new ProgressDialog(this);
        pd .setCancelable(false);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                /* 顯示ProgressDialog */
                pd = ProgressDialog.show(MainActivity.this, "標題", "加載中,請稍後……");

                /* 開啓一個新線程,在新線程裏執行耗時的方法 */
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        spandTimeMethod();// 耗時的方法
                        handler.sendEmptyMessage(0);// 執行耗時的方法之後發送消給handler
                    }

                }).start();
            }
        });

    }

    private void spandTimeMethod() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {// handler接收到消息後就會執行此方法
            pd.dismiss();// 關閉ProgressDialog
        }
    };
}

歡迎參考,僅作存檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章