`

Android有进度条的下载图片并且显示图片

阅读更多
layout文件布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bt"
        android:text="开始下载文件" />

    <ProgressBar
        android:id="@+id/pb"
        android:layout_width="fill_parent"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_height="wrap_content" />
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/img"/>
</LinearLayout>

文件工具类
package com.spring.sky.download;

import java.io.File;

import android.content.Context;
import android.os.Environment;
import android.util.Log;
/**
 * 文件工具类
 * @author spring sky
 * Email:vipa1888@163.com
 * QQ:840950105
 * name:石明政
 *
 */
public class FileUtil {
	/**
	 * 检验SDcard状态
	 * @return boolean
	 */
	public static boolean checkSDCard()
	{
		if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
		{
			return true;
		}else{
			return false;
		}
	}
	/**
	 * 保存文件文件到目录
	 * @param context
	 * @return  文件保存的目录
	 */
	public static String setMkdir(Context context)
	{
		String filePath;
		if(checkSDCard())
		{
			filePath = Environment.getExternalStorageDirectory()+File.separator+"myfile";
		}else{
			filePath = context.getCacheDir().getAbsolutePath()+File.separator+"myfile";
		}
		File file = new File(filePath);
		if(!file.exists())
		{
			boolean b = file.mkdirs();
			Log.e("file", "文件不存在  创建文件    "+b);
		}else{
			Log.e("file", "文件存在");
		}
		return filePath;
	}
}

界面上的逻辑处理
package com.spring.sky.download;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;
/**
 * 文件下载界面
 * @author spring sky
 * Email:vipa1888@163.com
 * QQ:840950105
 * name:石明政
 *
 */
public class IndexActivity extends Activity implements OnClickListener{
	private static final int DOWNLOAD_PREPARE = 0;
	private static final int DOWNLOAD_WORK = 1;
	private static final int DOWNLOAD_OK = 2;
	private static final int DOWNLOAD_ERROR =3;
	private static final String TAG = "IndexActivity";
	private Button bt ;
	private ProgressBar pb;
	private ImageView img;
	/**
	 * 需要下载的文件
	 * 注意:在模拟器上面使用无法解析有域名的主机
	 */
	private String url = "http://61.155.165.32/shuixiyue/pic/item/f141247490d0e96fb251b963.jpg";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		bt = (Button) this.findViewById(R.id.bt);
		bt.setOnClickListener(this);
		pb = (ProgressBar) this.findViewById(R.id.pb);
		pb.setVisibility(ProgressBar.INVISIBLE);
		img =(ImageView) this.findViewById(R.id.img);
	}
	
	/**
	 * 按钮点击事件
	 */
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.bt:
			Toast.makeText(this, "开始下载文件", Toast.LENGTH_SHORT).show();
			new Thread(){
				@Override
				public void run() {
					downloadFile();
					super.run();
				}
			}.start();
			break;
		}
	}
	/**
	 * 文件下载
	 */
	private void downloadFile()
	{
		try {
			URL u = new URL(url);
			URLConnection conn = u.openConnection();
			conn.connect();
			InputStream is = conn.getInputStream();
			fileSize = conn.getContentLength();
			if(fileSize<1||is==null)
			{
				sendMessage(DOWNLOAD_ERROR);
			}else{
				sendMessage(DOWNLOAD_PREPARE);
				FileOutputStream fos = new FileOutputStream(getPath());
				byte[] bytes = new byte[1024];
				int len = -1;
				while((len = is.read(bytes))!=-1)
				{
					fos.write(bytes, 0, len);
					downloadSize+=len;
					sendMessage(DOWNLOAD_WORK);
				}
				sendMessage(DOWNLOAD_OK);
				is.close();
				fos.close();
			}
		} catch (Exception e) {
			sendMessage(DOWNLOAD_ERROR);
			e.printStackTrace();
		} 
	}
	/**
	 * 文件一共的大小
	 */
	int fileSize = 0;
	/**
	 * 已经下载的大小
	 */
	int downloadSize = 0;
	/**
	 * handler处理消息
	 */
	private Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case DOWNLOAD_PREPARE:
				Toast.makeText(IndexActivity.this, "下载准备", Toast.LENGTH_SHORT).show();
				pb.setVisibility(ProgressBar.VISIBLE);
				Log.e(TAG, "一共:"+fileSize);
				pb.setMax(fileSize);
				break;
			case DOWNLOAD_WORK:
				Log.e(TAG, "已下载:"+downloadSize);
				pb.setProgress(downloadSize);
				int res = downloadSize*100/fileSize;
				bt.setText("已下载:"+res+"%");
				break;
			case DOWNLOAD_OK:
				try {
					if(getPath().endsWith(".jpg")||getPath().endsWith(".png")){
						FileInputStream fis = new FileInputStream(getPath());
						img.setImageBitmap(BitmapFactory.decodeStream(fis));
					}
					downloadSize = 0;
					fileSize = 0;
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
				Toast.makeText(IndexActivity.this, "下载完成", Toast.LENGTH_SHORT).show();
				break;
			case DOWNLOAD_ERROR:
				Toast.makeText(IndexActivity.this, "下载出错", Toast.LENGTH_SHORT).show();
				break;
			}
			super.handleMessage(msg);
		}
	};
	/**
	 * 得到文件的保存路径
	 * @return
	 * @throws IOException
	 */
	private String getPath() throws IOException
	{
		String path = FileUtil.setMkdir(this)+File.separator+url.substring(url.lastIndexOf("/")+1);
		return path;
	}
	/**
	 * 给hand发送消息
	 * @param what
	 */
	private void sendMessage(int what)
	{
		Message m = new Message();
		m.what = what;
		handler.sendMessage(m);
	}
}


转自: http://blog.csdn.net/vipa1888/article/details/7208956
非常感谢 哈哈
分享到:
评论

相关推荐

    android 竖直自定义进度条 带文字竖直进度条 类似电量显示

    本示例主要讲解如何创建一个竖直方向的自定义进度条,并且带有文字显示,类似手机电量的展示效果。这一功能对于某些需要实时反馈进度的应用场景,如加载、下载等,尤其有用。 首先,我们从`progressbar`这个标签...

    加载图片时进度条

    在移动应用或网页中,当图片从服务器下载到用户的设备上时,显示一个进度条可以有效地告诉用户操作正在进行,并且有助于缓解用户对加载时间过长的焦虑。 1. **进度条原理** 进度条通常是通过计算已下载的数据量与...

    Android-一个简单的Android自定义圆环进度条~

    本文将深入探讨如何基于Android平台创建一个自定义的圆环进度条,这个进度条适用于文件上传、下载以及图片加载等场景。 首先,我们需要了解Android中的进度条(ProgressBar)组件。系统提供的ProgressBar有两种模式...

    AsyncTask下载网络图片 进度条提示

    以下是一个简单的`AsyncTask`实现网络图片下载并显示进度的例子: ```java public class DownloadImageTask extends AsyncTask, Integer, Bitmap&gt; { private ProgressBar progressBar; private ImageView ...

    安卓进度条loadingprogress相关-CoverLoading图片imageview下载进度条.rar

    3. **图片下载与加载**:在Android中,我们通常使用第三方库如Picasso、Glide或Volley来加载网络图片。这些库支持异步加载,并且可以通过回调函数传递下载进度,从而更新自定义进度条的状态。 4. **AsyncTask**:...

    CoverLoading图片imageview下载进度条

    在Android开发中,我们经常需要在ImageView中展示网络图片,并且在图片下载过程中提供一个进度条来提升用户体验,让用户知道图片加载的状态。"CoverLoading图片imageview下载进度条"就是一个解决此类需求的自定义...

    android仿新浪微博下载图片

    4. **异步任务处理**:由于Android主线程不允许执行耗时操作,因此图片下载通常在子线程(AsyncTask、Thread、IntentService等)中进行。AsyncTask是Android提供的一种轻量级的异步处理类,适合处理一些短暂的后台...

    Android实现长按图片保存至相册功能

    在Android开发中,实现长按图片保存至相册的功能是一项常见的需求,它允许用户保存应用内显示的图片到他们的设备相册。下面我们将详细讨论如何实现这个功能,并结合提供的代码片段进行解析。 首先,我们需要监听...

    android图片异步下载

    Fresco使用了SurfaceView来显示图片,降低了内存消耗,同时提供了强大的动画和自定义缓存机制。 7. **线程池管理** - 使用`ExecutorService`和`ThreadPoolExecutor`进行线程池管理,可以有效地控制并发任务的数量...

    android 下载图片

    在Android平台上,下载图片是一项常见的任务,特别是在开发与网络交互的应用时。本篇文章将深入探讨如何在Android中实现从URL加载并...通过实践和调试这些代码,你将更深入地掌握Android网络编程以及图片下载的技巧。

    带进度条的imageview..zip

    在Android开发中,为用户提供一个显示图片并且带有加载进度条的功能是常见的需求,尤其是在处理大图或者网络图片时。这个开源项目"带进度条的imageview",即"ProgressableImageView",旨在解决这一问题,提供了...

    PhotoView android 图片缩放浏览器

    在描述中提到的"加载时有进度条显示,加载完进度条消失",这正是UIL库中的特性,可以通过设置监听器来控制进度条的显示与隐藏,提供用户友好的加载体验。 其次,ViewPager 是Android SDK中的一个视图容器,它允许...

    Android 多商品订单多图评价功能实现(类似淘宝,可自定义可上传图片数量)

    1. **进度提示**:在图片上传过程中显示进度条,让用户了解上传进度。 2. **上传成功提示**:图片上传成功后,将其URL添加到评论实体的图片数组中,并更新UI显示。 3. **取消上传**:提供取消上传的选项,释放资源并...

    加载loading进度条动画

    常见的有线性进度条和圆形进度条。线性进度条通常显示在屏幕底部或顶部,以填充或移动的条形来代表加载的进度。圆形进度条则以环形或半环形填充来呈现,形象地表示百分比完成度。在本示例中,...

    Android应用源码之带进度条简易浏览器项目.zip

    这个项目对于初学者来说是一个很好的学习资源,它揭示了如何在Android平台上实现网络浏览功能,并且在加载网页时展示进度条以提高用户体验。 首先,我们可以从标签“安卓 android”推测,这个项目是针对Android平台...

    Android仿微信添加照片并且随意限制照片数量并显示缩略图界面

    总之,这个项目涉及到了Android应用开发中的图片选择、图片处理、内存优化、视图适配等多个关键知识点,对于提升Android开发者在实际项目中的技能很有帮助。通过学习和实践,开发者可以更好地掌握如何在Android应用...

    Android应用源码带进度条简易浏览器项目.zip

    这个“Android应用源码带进度条简易浏览器项目”是一个典型的Android开发示例,它展示了如何在Android平台上构建一个简单的浏览器应用,并且集成了进度条功能,以提供用户友好的加载体验。下面,我们将深入探讨这个...

    Android基于HttpClient实现文件上传,提供进度条接口实现

    本教程将深入探讨如何利用Apache的HttpClient库实现文件上传,并且在上传过程中提供进度条接口,以便用户可以直观地看到文件传输的进度。我们将不依赖任何第三方jar包,而是直接对httpmime源码进行改造。 首先,...

    android studio 使用Fresco加载网络图片(包括gif)

    在Android开发中,加载网络图片是一项常见的任务,而Fresco是一款强大的图像管理库,特别适合处理复杂的图片加载、缓存和显示问题。本教程将详细讲解如何在Android Studio项目中利用Fresco来加载网络上的静态图片和...

Global site tag (gtag.js) - Google Analytics