異步任務AsyncTask下載圖片

一:ANR現(xiàn)象:

==應用程序無響應<Application not Responsed>==

1.單線程模型的原則:
  • 主線程UI不能被阻塞
  • 非主線程不能更新UI
public class MainActivity extends Activity{
    private TextView textView;
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInatanceState);
        setContentView(R.layout.main_activity);
        //違反第二原則:在非主線程更新UI
        //CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        new Thread(){
            public void run(){
                int count = 0;
                while(count < 100){
                    count ++ ;
                    try{
                        Thread.sleep(1000);
                    }
                    catch(Exception e){
                        e.printStackTrace;
                    }
                    //在非UI線程更新UI
                    textView.setText("當前count:"+count);
                }
            };
        }.start();
    }
    
    //違反第一個原則,導致ANR現(xiàn)象出現(xiàn)
    public void click(View view){
        try{
            Thread.sleep(6000);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

二.AsyncTask的基本使用

1.自定義一個類繼承系統(tǒng)的AsyncTask,其參數(shù)說明如下:
  • Params:啟動異步任務執(zhí)行的輸入?yún)?shù) 例如HTTP請求的URL一般是String類型
  • Progress:后臺執(zhí)行任務的百分比 通常是Integer類型
  • Result:后臺執(zhí)行任務最終返回的結果
    ==注意:AsyncTask的執(zhí)行分為四個步驟 每一步都對應一個回調方法(由應用程序自動調用的方法) 開發(fā)者需要做的就是實現(xiàn)這些方法==
2.為了正確的使用AsyncTask類蒜茴,必須遵守以下幾條準則:
  • AsyncTask的實例必須在UI線程中創(chuàng)建
  • execute方法必須在UI線程中調用
  • 不要手動去調用onPreExecute() doInBaground() onProgressUpdate() onPostExecute()
  • AsyncTask的實例只能被執(zhí)行一次 多次調用的時候將會出現(xiàn)異常

==代碼:首先自定義一個類實現(xiàn)系統(tǒng)AsyncTask,異步圖片下載:==

public class MyAsyncTask extends AsyncTask<String , Void , Bitmap>{
    //上下文對象
    private Context context;
    private ProgressDialog dialog;
    private ImageView imageView;
    
    //構造
    public MyAsyncTask(Context context , ImageView imageView){
        super();
        this.context = context;
        this.imageView = imageView;
    }
    
    /**
     * 實現(xiàn)四個系統(tǒng)回調的方法
     */
     
    /**
     * 1.onPreExecute()方法:在后臺執(zhí)行前的準備工作秕硝,主線程調用
     * 準備工作:做什么拢军?>創(chuàng)建進度對話框
     */
    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        dialog = new ProgressDialog();
        dialog.setIcon(R.drawable.xxx);
        dialog.setTitle("友情提示赁项!");
        dialog.setMessage("正在玩命為您加載中");
        //下面show()方法不要忘了励负,否則不顯示進度對話框
        dialog.show();
    }
    
    /**
     *  2.doInBackground()方法:非主線程調用莺奔,后臺的主要工作線程鸠珠,
     *  如耗時的操作(網(wǎng)絡下載圖片饺蔑,下載JSON等)都放在這里執(zhí)行锌介。
     *  它是子線程,不可以在這里做UI操作(重要)
     *  參數(shù)是String類型字符數(shù)組猾警,通常為傳入的url
     */
    @Override
    public void doInBackground(String...params){
        //網(wǎng)絡請求:
        /*創(chuàng)建HttpClient的實例*/
        HttpClient httpClient = new DefaultHttpClient();
        /*創(chuàng)建連接方法的實例孔祸,HttpGet()的構造中傳入url地址*/
        HttpGet httpGet = new HttpGet(params[0]);
        try{
            /*調用創(chuàng)建好的HttpClient的實例的execute方法來發(fā)送創(chuàng)建好的HttpGet或HttpPost請求,并返回HttpResponse對象*/
            HttpResponse httpResponse = httpClient.execute(httpGet);
            if(httpResponse.getStatusLine().getStatusCode() == 200){
                /*返回實體對象*/
                HttpEntity entity = httpResponse.getEntity();
                byte [] data = EntityUtils.toByteArray(entity);
                Bitmap bitmap = BitmapFactory.decodeByteArray(data,0,data.length);
                return bitmap;
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally{
            httpClient.getConnectionManager().shutdown();
        }
    }
    
    /**
     *  更新顯示進度发皿,主線程調用
     */
    @Override
    public void onProgressUpdate(Void...values){
        super.onProgressUpdate(values);
    }
    
    /**
     *  在doInBackground執(zhí)行完成之后調用,后臺的計算結果將通過該方法傳遞到UI線程,回到主線程(主線程調用的)
     *  可以實現(xiàn)主線程和子線程之間的數(shù)據(jù)交互
     */
    public void onPostExcute(Bitmap bitmap){
        super.onPostExecute(bitmap);
        if(bitmap != null){
            imageView.setImageBitmap(bitmap);
        }
        else{
            Toast.makeText(context,"下載圖片失敗",Toast.LENGTH.LONG).show();
        }
        //關閉進度對話框
        dialog.dismiss();
    }
}

測試代碼:

public class MainActivity extends Activity{
    private ImageView imageView;
    private MyAsyncTask myAsyncTask;
    private String url = "";http://p5.qhimg.com/dmt/490_350_/t01405cf23f986e5ef6.jpg
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        
        imageView = (ImageView)findViewById(R.id.iv_imageview);
        //創(chuàng)建AsyncTask的實例
        myAsyncTask = new MyAsyncTask(this,imageView);
    }
    
    //點擊按鈕崔慧,開始異步下載圖片
    public void downloadPic(View view){
        /*AsyncTask的實例只能被執(zhí)行一次*/
        myAsyncTask.execute(url);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市穴墅,隨后出現(xiàn)的幾起案子惶室,更是在濱河造成了極大的恐慌,老刑警劉巖玄货,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皇钞,死亡現(xiàn)場離奇詭異,居然都是意外死亡松捉,警方通過查閱死者的電腦和手機夹界,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隘世,“玉大人可柿,你說我怎么就攤上這事鸠踪。” “怎么了趾痘?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵慢哈,是天一觀的道長。 經(jīng)常有香客問我永票,道長卵贱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任侣集,我火速辦了婚禮键俱,結果婚禮上,老公的妹妹穿的比我還像新娘世分。我一直安慰自己编振,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布臭埋。 她就那樣靜靜地躺著踪央,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓢阴。 梳的紋絲不亂的頭發(fā)上畅蹂,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音荣恐,去河邊找鬼液斜。 笑死,一個胖子當著我的面吹牛叠穆,可吹牛的內(nèi)容都是我干的少漆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼硼被,長吁一口氣:“原來是場噩夢啊……” “哼示损!你這毒婦竟也來了?” 一聲冷哼從身側響起祷嘶,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤屎媳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后论巍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烛谊,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年嘉汰,在試婚紗的時候發(fā)現(xiàn)自己被綠了丹禀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖双泪,靈堂內(nèi)的尸體忽然破棺而出持搜,到底是詐尸還是另有隱情,我是刑警寧澤焙矛,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布葫盼,位于F島的核電站,受9級特大地震影響村斟,放射性物質發(fā)生泄漏贫导。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一蟆盹、第九天 我趴在偏房一處隱蔽的房頂上張望孩灯。 院中可真熱鬧,春花似錦逾滥、人聲如沸峰档。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讥巡。三九已至,卻和暖如春舔哪,著一層夾襖步出監(jiān)牢的瞬間尚卫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工尸红, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刹泄。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓外里,卻偏偏與公主長得像,于是被迫代替她去往敵國和親特石。 傳聞我的和親對象是個殘疾皇子盅蝗,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評論 25 707
  • Android Handler機制系列文章整體內(nèi)容如下: Android Handler機制1之ThreadAnd...
    隔壁老李頭閱讀 3,206評論 1 15
  • Android開發(fā)者:你真的會用AsyncTask嗎? 導讀.1 在Android應用開發(fā)中姆蘸,我們需要時刻注意保證...
    cxm11閱讀 2,709評論 0 29
  • 在Android中我們可以通過Thread+Handler實現(xiàn)多線程通信墩莫,一種經(jīng)典的使用場景是:在新線程中進行耗時...
    呂侯爺閱讀 2,051評論 2 23
  • 故鄉(xiāng)是長江中游的一個濱江小城。我在小城里度過了六年的中學生涯逞敷,在小城購物狂秦、娛樂、和朋友相聚推捐、拜訪親友裂问。小城見證了我...
    瀏如閱讀 388評論 0 4