Android 延迟加载( AsynTask 异步加载) | FYCoder

Android 使用 AsynTask 进行异步加载,一些耗时较长的操作需要使用异步加载,这样可以让用户获得较好的体验经历。

代码如下:

?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
package com.fycoder;
 
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
 
 
public class LiuyActivity  extends Activity{   
 
    private ProgressDialog progressDialog = null;
    private String showmsg = "ShowMsg" ;
    private Button   b  ;
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main2);         
          //progressDialog = new ProgressDialog(this);
          //progressDialog.setTitle("請稍等");
          //progressDialog.setMessage("正在加載...");        
          b =(Button)findViewById(R.id.button315);             
          progressDialog = ProgressDialog.show(LiuyActivity.this, "请稍等...", "获取数据中...", true);
          new LiuyAsynTask().execute("第一个参数");
    
         
    /**
     * @author liuy
     *
     * 参数:
     *  第一個为doInBackground接受的参數,
     *  第二個为顯示進度的参數,
     *  第三個为doInBackground返回和onPostExecute傳入的参數
     * */
    private class LiuyAsynTask extends AsyncTask<String, Void, String[]> {
        /**
         * onPreExecute():
         *      該方法將在執行實際的後台操作前被UI 線程調用。
         *      可以在該方法中做一些准備工作,如在界面上顯示
         *      一個進度條,或者一些控件的實例化,這個方法可
         *      以不用實現。
         * */
        @Override
        protected void onPreExecute () {
            super.onPreExecute();
            progressDialog.show(); //显示等待状态条
        }
         
        /**
         * doInBackground(Params...):
         *      將在 onPreExecute 方法執行後馬上執行,該方法運行在後台線程中。
         *      這裏將主要負責執行那些很耗時的後台處理工作。可以調用
         *          publishProgress
         *      方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。
         * */
        @Override
        protected String[] doInBackground (String... params) {
            String[] result = new String[2];
            result[0]="ret1";
            result[1]="ret2";
            Log.w(showmsg, "doInBackground()显示传进的参数 params[0]:"+params[0]);
             
            //---- 耗时,等待一些时间 -----
            for (int i=0 ;i<999000000;i++){
                int  a = 1+1+1*8*8*8*8*8*9 ;
            }
            //---------
             
            // b.setText("^_^");    //在此处修改 Activity上的UI内容会报错,
                                    //只可在onPostExecute里修改才行
            return result;
        }
 
        /**
         *  onPostExecute(Result):
         *      在doInBackground 执行完成后,onPostExecute方法将被UI
         *      线程調用,後台的計算結果將通過該方法傳遞到UI线程,並且在界
         *      面上展示给用戶.
         * */
        @Override
        protected void onPostExecute (String[] result) {
            super.onPostExecute(result);
             
            Log.w(showmsg, "onPostExecute()显示传进的参数 result[0]:"+result[0]);
            Log.w(showmsg, "onPostExecute()显示传进的参数 result[1]:"+result[1]);           
            progressDialog.dismiss(); //关闭等待进度条
            //在按钮上设置需要修改的内容
            //  注:  Activity 上的 UI的一些修改,在onPostExecute 才能
            //      正确执行,若在doInBackground里修改 Activity UI内容会报错。
            b.setText("^_^");
        }
         
        /**
         * onCancelled()
         *      在用戶取消線程操作的時候調用。在主線程中調用
         *      onCancelled()的時候調用
         * */
 
    }
 
}
 
/**
 * 可参考:
 * http://blog.csdn.net/cjjky/article/details/6684959  Android中AsyncTask的简单用法
 *
 * */

main2.xml :

?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?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"
    android:gravity="center"
    >
    <Button
    android:id="@+id/button315"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="old msg"
    />
     
</LinearLayout>

LogCat显示:

14:28:32: W/ShowMsg: doInBackground()显示传进的参数 params[0]:第一个参数

14:28:40: W/ShowMsg: onPostExecute()显示传进的参数 result[0]:ret1

14:28:40: W/ShowMsg: onPostExecute()显示传进的参数 result[1]:ret2

还有一些其他方法的参考示例,可以参考下面的链接:(参考度 5* 满格)

    Imageview With Loading Spinner  (提供源码下载)  (参考度:****)

    http://www.anddev.org/novice-tutorials-f8/imageview-with-loading-spinner-t49439.html

    http://blog.blundell-apps.com/imageview-with-loading-spinner/

    Android異步加載網絡圖片    (参考度:***)

    http://zh.iqadd.com/item/android-yibu-jiazai-wangluo-tupian

    Android网络加载时显示进度条     (参考度:**)

    http://www.youmi.net/bbs/thread-99-1-1.html

–EOF–

来源URL:http://fycoder.com/FYCblog/?p=328