歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android開發教程:Handler+thread 加載網絡圖片

關於Android多線程處理UI-我在網上查了下資料發現有好幾種,本次學習只是其中一種,主要是利用handler結合Thread更新UI。

下面是我寫的小Demo:

Handler+thread 加載網絡圖片,我在網上隨便找了三張圖片,分別開三個線程加載他們,然後在Activity中顯示。

其中一個線程出現異常不會影響到其他線程更不會阻塞主線程(UI線程) ,這是多線程帶來的好處之一。

本次Demo主要是利用Handler.sendMessage(...)把消息壓進消息隊列,過後通過Handler.handleMessage(...)在UI線程中處理壓入的消息。從隊列中取出消息時會根據壓入的不同消息來更新UI。圖片在外部線程中加載,加載完後sendmessage在主線程中更新UI。外部線程只顧加載圖片,而更新UI是主線程(UI線程)的事,這個就達到了多線程異步加載網絡圖片的目的

ThreadDemo.java   ThreadDemo是一個Activity,UI在這裡面更新

  1. package com.study.thread;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.ProgressDialog;  
  5. import android.graphics.Bitmap;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.util.Log;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.ImageView;  
  13. import android.widget.Toast;  
  14.   
  15. public class ThreadDemo extends Activity {  
  16.     private static final String TAG =  "ThreadDemo";  
  17.     // 我把三個線程編了號   
  18.     private static final int THREAD_1 = 1;  
  19.     private static final int THREAD_2 = 2;  
  20.     private static final int THREAD_3 = 3;  
  21.     private ImageView mImgView1;  
  22.     private ImageView mImgView2;  
  23.     private ImageView mImgView3;  
  24.       
  25.     // 記錄消息   
  26.     int count = 0;  
  27.       
  28.     ProgressDialog mDialog ;  
  29.       
  30.     // 網上找的三張圖片的地址   
  31.     String[] urls =  new String[]  
  32.             {  
  33.             "http://hiphotos.baidu.com/yuangengqiang/pic/item/252196ca222b88ad50664f58.jpg",  
  34.             "http://hiphotos.baidu.com/lzc196806/pic/item/d84f738da76514d2f11f3665.jpg",  
  35.             "http://hiphotos.baidu.com/735216726/pic/item/2488f146f7ea415e72f05d75.jpg"  
  36.             };  
  37.       
  38.     @Override  
  39.     public void onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         setContentView(R.layout.main);  
  42.         this.getView();  
  43.         System.out.println("ThreadDemo-----"+Thread.currentThread().getName());  
  44.           
  45.         // 處理按鈕按下   
  46.         findViewById(R.id.btnStart).setOnClickListener(new OnClickListener()  
  47.         {  
  48.               
  49.             @Override  
  50.             public void onClick(View v)  
  51.             {  
  52.                 count = 0;  
  53.                 mDialog = ProgressDialog.show(ThreadDemo.this"",   
  54.                         "Loading. Please wait..."true);  
  55.                 // 開啟線程:第一個線程處理第一張圖片以此類推   
  56.                 new Thread(new LoadImageRunnable(mHandler,THREAD_1,urls[0])).start();  
  57.                 new Thread(new LoadImageRunnable(mHandler,THREAD_2,urls[1])).start();  
  58.                 new Thread(new LoadImageRunnable(mHandler,THREAD_3,urls[2])).start();  
  59.                 ThreadDemo.this.setTitle("線程已近創建完畢");  
  60.             }  
  61.               
  62.         });  
  63.     }  
  64.       
  65.     private void getView()  
  66.     {  
  67.         mImgView1 = (ImageView)findViewById(R.id.img01);  
  68.         mImgView2 = (ImageView)findViewById(R.id.img02);  
  69.         mImgView3 = (ImageView)findViewById(R.id.img03);  
  70.     }  
  71.       
  72.       
  73.       
  74.     private Handler mHandler = new Handler()  
  75.     {  
  76.           
  77.         // 利用handleMessage更新UI   
  78.         public void handleMessage (Message msg)  
  79.         {  
  80.             switch(msg.what)  
  81.             {  
  82.                 case ThreadDemo.THREAD_1:  
  83.                     mImgView1.setImageBitmap((Bitmap)msg.obj);  
  84.                     Log.i(TAG, "thread-1");  
  85.                     break;  
  86.                 case ThreadDemo.THREAD_2:  
  87.                     mImgView2.setImageBitmap((Bitmap)msg.obj);  
  88.                     Log.i(TAG, "thread-2");  
  89.                     break;  
  90.                 case ThreadDemo.THREAD_3:  
  91.                     mImgView3.setImageBitmap((Bitmap)msg.obj);  
  92.                     Log.i(TAG, "thread-3");  
  93.                     break;  
  94.                       
  95.                 // 如有異常會有提示   
  96.                 default:  
  97.                     String info = "第"+msg.what%10+"個線程"+"出現異常";  
  98.                     Toast.makeText(ThreadDemo.this, info , Toast.LENGTH_LONG).show();  
  99.                     break;  
  100.               
  101.             }  
  102.             count++;  
  103.             if(3==count)  
  104.             {  
  105.                 mDialog.dismiss();  
  106.             }  
  107.               
  108.         }  
  109.     };  
  110. }  
Copyright © Linux教程網 All Rights Reserved