歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發教程:Handler+thread 加載網絡圖片

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

日期:2017/3/1 10:48:01   编辑:Linux編程

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