网络图片下载

本文介绍安卓通信的一个小例子,实现图片的下载,并使用Handler通知主线程刷新UI,显示在街面上。

 

准备工作:部署服务器,可以使用WampServer或者Tomcat部署服务器,笔者用的是WampServer。在www目录下放置一张名为13.jpg的图片。


网络图片下载_第1张图片
 

下面开始新建工程,下面是MainActivity的布局文件,放置一个按钮,放置一个ImageView,点击按钮,实现图片下载并显示到界面上

 

<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity" >
    
    <Button
        android:id="@+id/bt_ensure"
        android:text="下载图片"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <ImageView
        android:id="@+id/iv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

 

下面是MainActivity的编写,先检查该文件是否存在,存在就直接从SD卡读取,否则进行下载,由于下载是一个耗时操作,需要新开一个线程来处理。重写Run方法,并start。关键代码是下载的过程和用handler将消息通知给主线程,主线程收到消息之后刷新界面

 

package com.example.imageviewer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity{
	public Button bt_ensure;
	public static ImageView iv_show;
	public static MainActivity ma;
	
        //新建handler对象,并重写handleMessage方法,通过message的标识区分消息,执行不同的操作
	public static Handler handler=new Handler(){
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				iv_show.setImageBitmap((Bitmap) msg.obj);
				break;
			case 0:
				Toast.makeText(ma, "请求失败", 0).show();
				break;
			}
			
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.activity_main);
		
		ma=this;
		
		iv_show=(ImageView)findViewById(R.id.iv_show);
		
		bt_ensure=(Button) findViewById(R.id.bt_ensure);
		
		bt_ensure.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				final String path="http://10.63.217.115/13.jpg";
				final File file=new File(getCacheDir(),getFileName(path));
				if(file.exists()){
					Toast.makeText(MainActivity.this, "从文件夹读取的", 0).show();
                                        //如果本地文件已经存在该文件,就直接从本地读取显示在界面上
					Bitmap bm=BitmapFactory.decodeFile(file.getAbsolutePath());
					iv_show.setImageBitmap(bm);
				}else{
					Toast.makeText(MainActivity.this, "从网上下载的", 0).show();
					Thread t=new Thread(){
						@Override
						public void run() {
							// TODO Auto-generated method stub
							
							try {
								URL url=new URL(path);//获取URL对象
								
								HttpURLConnection cnn=(HttpURLConnection) url.openConnection();//得到HttpURLConnection对象
								
								cnn.setRequestMethod("GET");//选择"GET"方式提交请求
								
								cnn.setReadTimeout(5000);//设置相应超时5s
								
								cnn.setConnectTimeout(5000);//设置连接超时为5s
								
								cnn.connect();//连接
								
								if(cnn.getResponseCode()==200){
									//返回200证明服务器响应成功,请求得到回应
									InputStream is=cnn.getInputStream();
									
									//把流写进文件,保存到本地
									
									
									
									FileOutputStream fos=new FileOutputStream(file);
									
									byte[] b=new byte[1024];
									
									int len=0;
									
									while((len=is.read(b))!=-1){
										fos.write(b,0,len);
									}
									fos.close();
									
									//通过
									Bitmap bm=BitmapFactory.decodeFile(file.getAbsolutePath());
									
									Message msg=handler.obtainMessage();//通过handler对象获得message
									
									msg.obj=bm;/设置message的obj对象是bm对象
									
									msg.what=1;//标识为1
									
									handler.sendMessage(msg);//发送消息
								}else{
									//如果文件已存在也发送一条消息,让主线程直接刷新界面
									Message msg=handler.obtainMessage();
									
									msg.what=0;
									
									handler.sendMessage(msg);
								}
							} catch (MalformedURLException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							
						}
					};
					t.start();
				}
			}
		});
	}
	
	
	public String getFileName(String path){
		int index=path.lastIndexOf("/");
		return path.substring(index+1);
	}
	
}

 

 

效果如下,点击按钮,实现图片下载并显示在界面上
网络图片下载_第2张图片网络图片下载_第3张图片
 
 


  

你可能感兴趣的:(网络图片下载)