天天看点

Android的ImageView如何显示网络图片资源

http://blog.csdn.net/forlong401/article/details/7737571

1.定义handler

    private static final int DOWNLOAD_IMAGE_SUCCESS = 0;

    private static final int DOWNLOAD_IMAGE_FAILURE = 1;

    private ImageView mDetailImageView;

    private String mImageUrl;    

    private Thread mDownloadImageThread;

    private Bitmap mDownloadImageBitmap;

    private Handler mHandler = new Handler() {

        @Override

        public void handleMessage(final Message msg) {

            switch (msg.what) {

                case DOWNLOAD_IMAGE_SUCCESS:{

                    if (mDownloadImageBitmap != null) {

                        mDetailImageView.setImageBitmap(mDownloadImageBitmap);

                        mDetailImageView.setVisibility(View.VISIBLE);

                    }                    

                    break;

                }

                case DOWNLOAD_IMAGE_FAILURE:{

                    if (mDownloadImageBitmap != null) {

                        mDownloadImageBitmap.recycle();

                        mDownloadImageBitmap = null;

                        // TODO: should set default image to notice user download failure.

                        mDetailImageView.setVisibility(View.VISIBLE);

                    }                    

                    break;

                }     

            }

        }

    };

2.定义runnable

    private class DownloadImageRunner implements Runnable {

        public void run() {

            Message msg = new Message();

            msg.what = DOWNLOAD_IMAGE_SUCCESS;

            try {

                URL url;

                url = new URL(mImageUrl);

                HttpURLConnection conn;

                conn = (HttpURLConnection) url.openConnection();

                conn.setConnectTimeout(6000);

                conn.setDoInput(true);

                conn.setUseCaches(false);

                InputStream is = conn.getInputStream();

                mDownloadImageBitmap = BitmapFactory.decodeStream(is);

                is.close();                

            } catch (IOException e) {

                msg.what = DOWNLOAD_IMAGE_FAILURE;

                e.printStackTrace();

            } catch (Exception e) {

                msg.what = DOWNLOAD_IMAGE_FAILURE;

                e.printStackTrace();

            }

            mHandler.sendMessage(msg);

        }        

    }

3.使用线程                          

    DownloadImageRunner downloadImageRunner = new DownloadImageRunner();

    mDownloadImageThread = new Thread(downloadImageRunner);

    mDownloadImageThread.start();    

4.Activity销毁时清理内存

    @Override

    public void onDestroy() {

        super.onDestroy();    

        if (mDownloadImageBitmap != null) {

            mDownloadImageBitmap.recycle();

            mDownloadImageBitmap = null;

        }

    }

ps:

MainActivity.java

package com.example.newtest;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.util.ByteArrayBuffer;
 
  

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {

	public  Button bTest,bTest2;
	
	

	 private static final int DOWNLOAD_IMAGE_SUCCESS = 0;
	    private static final int DOWNLOAD_IMAGE_FAILURE = 1;
	    private ImageView mDetailImageView;
	    private String mImageUrl="http://lh5.ggpht.com/_mrb7w4gF8Ds/TCpetKSqM1I/AAAAAAAAD2c/Qef6Gsqf12Y/s144-c/_DSC4374%20copy.jpg";    
	    private Thread mDownloadImageThread;
	    private Bitmap mDownloadImageBitmap;
	    private Handler mHandler = new Handler() {
	        @Override
	        public void handleMessage(final Message msg) {
	            switch (msg.what) {
	                case DOWNLOAD_IMAGE_SUCCESS:{
	                    if (mDownloadImageBitmap != null) {
	                        mDetailImageView.setImageBitmap(mDownloadImageBitmap);
	                        mDetailImageView.setVisibility(View.VISIBLE);
	                    }                    
	                    break;
	                }
	                case DOWNLOAD_IMAGE_FAILURE:{
	                    if (mDownloadImageBitmap != null) {
	                        mDownloadImageBitmap.recycle();
	                        mDownloadImageBitmap = null;
	                        // TODO: should set default image to notice user download failure.
	                        mDetailImageView.setVisibility(View.VISIBLE);
	                    }                    
	                    break;
	                }     
	            }
	        }
	    };
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
		{
			super.onCreate(savedInstanceState);
			
			setContentView(R.layout.activity_main);
			 
			mDetailImageView = (ImageView) findViewById(R.id.imageViewDownload);
			
			bTest = (Button) findViewById(R.id.button1);
			bTest.setOnClickListener(new View.OnClickListener() {
				
				@Override
				public void onClick(View v)
					{  
						// TODO Auto-generated method stub
						mImageUrl="http://lh5.ggpht.com/_mrb7w4gF8Ds/TCpetKSqM1I/AAAAAAAAD2c/Qef6Gsqf12Y/s144-c/_DSC4374%20copy.jpg"; 
						DownloadImageRunner downloadImageRunner = new DownloadImageRunner();
					    mDownloadImageThread = new Thread(downloadImageRunner);
					    mDownloadImageThread.start();    
						
					}
			});
 
			 
			bTest2 = (Button) findViewById(R.id.button2);
			bTest2.setOnClickListener(new View.OnClickListener() {
				
				@Override
				public void onClick(View v)
					{ 
						mImageUrl="http://lh3.ggpht.com/_lLj6go_T1CQ/TCD8PW09KBI/AAAAAAAAQdc/AqmOJ7eg5ig/s144-c/Juvenile%20Gannet%20despute.jpg";
						DownloadImageRunner downloadImageRunner = new DownloadImageRunner();
					    mDownloadImageThread = new Thread(downloadImageRunner);
					    mDownloadImageThread.start();    

					}
			});
			
		}
	

	
	 @Override
	protected void onDestroy()
		{
			// TODO Auto-generated method stub
			super.onDestroy();
			 if (mDownloadImageBitmap != null) {
		            mDownloadImageBitmap.recycle();
		            mDownloadImageBitmap = null;
		        }
		}



	private class DownloadImageRunner implements Runnable {
	        public void run() {
	            Message msg = new Message();
	            msg.what = DOWNLOAD_IMAGE_SUCCESS;
	            try {
	                URL url;
	                url = new URL(mImageUrl);
	                HttpURLConnection conn;
	                conn = (HttpURLConnection) url.openConnection();
	                conn.setConnectTimeout(6000);
	                conn.setDoInput(true);
	                conn.setUseCaches(false);
	                InputStream is = conn.getInputStream();
	                mDownloadImageBitmap = BitmapFactory.decodeStream(is);
	                is.close();                
	            } catch (IOException e) {
	                msg.what = DOWNLOAD_IMAGE_FAILURE;
	                e.printStackTrace();
	            } catch (Exception e) {
	                msg.what = DOWNLOAD_IMAGE_FAILURE;
	                e.printStackTrace();
	            }
	                        
	            mHandler.sendMessage(msg);
	        }        
	    }

}
           

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="150dp"
        android:layout_marginTop="156dp"
        android:layout_toRightOf="@+id/textView1"
        android:text="button1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_centerHorizontal="true"
        android:text="button2" />
    
 

     <ImageView
         android:id="@+id/imageViewDownload"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_centerVertical="true"
         android:layout_marginLeft="132dp"
         android:layout_toRightOf="@+id/button2"
         android:src="@android:drawable/btn_plus" />

</RelativeLayout>
           

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.newtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="17" />

  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_CORSE_LOCATION"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
    <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>	
    <uses-permission android:name="android.permission.GET_TASKS"/> 
 	<uses-permission android:name="android.permission.READ_LOGS" />  
 	<uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 
 	 <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 	 
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
        <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
        
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.newtest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
    
 
 
       
    
    </application>

</manifest>