Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)

时间:2021-01-01 05:51:27

加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行;2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载。

一、AsyncTask方式

1.main.xml:
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <ImageView
  6. android:id="@+id/img"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:layout_centerInParent="true" />
  10. </RelativeLayout>

2.MainActivity.java:

  1. package com.example.imageloaderdemo;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.net.HttpURLConnection;
  5. import java.net.MalformedURLException;
  6. import java.net.ProtocolException;
  7. import java.net.URL;
  8. import android.app.Activity;
  9. import android.graphics.Bitmap;
  10. import android.graphics.BitmapFactory;
  11. import android.os.AsyncTask;
  12. import android.os.Bundle;
  13. import android.view.View;
  14. import android.view.View.OnClickListener;
  15. import android.widget.Button;
  16. import android.widget.ImageView;
  17. public class MainActivity extends Activity {
  18. private ImageView mImageView;
  19. private static String URLSTRING;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. mImageView = (ImageView) findViewById(R.id.img);
  25. URLSTRING="http://photocdn.sohu.com/20110927/Img320705637.jpg";//图片地址
  26. MyAsyncTask myAsyncTask=new MyAsyncTask();
  27. myAsyncTask.execute(URLSTRING);
  28. }
  29. class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {
  30. @Override
  31. protected void onPostExecute(Bitmap result) {
  32. super.onPostExecute(result);
  33. mImageView.setImageBitmap(result);
  34. }
  35. @Override
  36. protected Bitmap doInBackground(String... params) {
  37. Bitmap bitmap=null;
  38. try {
  39. URL url=new URL(params[0]);
  40. HttpURLConnection connection=(HttpURLConnection) url.openConnection();
  41. connection.setRequestMethod("GET");
  42. connection.setConnectTimeout(5000);
  43. if(connection.getResponseCode()==200){
  44. InputStream inputStream=connection.getInputStream();
  45. bitmap=BitmapFactory.decodeStream(inputStream);
  46. }
  47. } catch (MalformedURLException e) {
  48. e.printStackTrace();
  49. } catch (ProtocolException e) {
  50. e.printStackTrace();
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. return bitmap;
  55. }
  56. }
  57. }

3.总结:

1.AsyncTask<String, Void, Bitmap>//三个参数,第一个为传入的URL,第二个表示中间状态的,这里传入空即可,第三个为返回值
2.doInBackground(String... params)方法新开了一个线程,AysncTask其他几个方法都在主线程中运行
3.除了doInBackground方法,其他方法都在主线程中运行,所以这里:
  1. mImageView.setImageBitmap(result);可以直接设置
 
运行实例如下:
 
Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)
成功的加载了网络图片。
 

二、Handler方式

异步请求Bitmap,因为子线程无法更新主线程UI,所以必须通过Handler的方式进行图片渲染。
 
布局文件不变,下面我们看一下MainActivity.java:
 
  1. package com.example.imageloaderdemo;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.net.HttpURLConnection;
  5. import java.net.MalformedURLException;
  6. import java.net.ProtocolException;
  7. import java.net.URL;
  8. import android.app.Activity;
  9. import android.graphics.Bitmap;
  10. import android.graphics.BitmapFactory;
  11. import android.os.Bundle;
  12. import android.os.Handler;
  13. import android.os.Message;
  14. import android.widget.ImageView;
  15. public class MainActivity extends Activity {
  16. private ImageView mImageView;
  17. private static String URLSTRING;
  18. private Handler handler = new Handler() {
  19. public void handleMessage(Message msg) {
  20. Bitmap bitmap = (Bitmap) msg.obj;
  21. mImageView.setImageBitmap(bitmap);
  22. };
  23. };
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_main);
  28. mImageView = (ImageView) findViewById(R.id.img);
  29. URLSTRING = "http://photocdn.sohu.com/20110927/Img320705637.jpg";// 图片地址
  30. MyThread myThread = new MyThread();
  31. myThread.start();// 调用线程
  32. }
  33. class MyThread extends Thread {
  34. @Override
  35. public void run() {
  36. super.run();
  37. Bitmap bitmap = null;
  38. try {
  39. URL url = new URL(URLSTRING);
  40. HttpURLConnection connection = (HttpURLConnection) url
  41. .openConnection();
  42. connection.setRequestMethod("GET");
  43. connection.setConnectTimeout(5000);
  44. if (connection.getResponseCode() == 200) {
  45. InputStream inputStream = connection.getInputStream();
  46. bitmap = BitmapFactory.decodeStream(inputStream);
  47. Message message = new Message();
  48. message.obj = bitmap;
  49. handler.sendMessage(message);
  50. }
  51. } catch (MalformedURLException e) {
  52. e.printStackTrace();
  53. } catch (ProtocolException e) {
  54. e.printStackTrace();
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. }
  60. }

总结:

1.新开一个线程用于网络数据的请求:
  1. class MyThread extends Thread{}
2.通过sendMessage发送对象,通过handleMessage处理数据。
 
很简单啊,希望可以帮到初学者。
 
喜欢的朋友关注我!谢谢