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
非常感谢 哈哈
分享到:
相关推荐
本示例主要讲解如何创建一个竖直方向的自定义进度条,并且带有文字显示,类似手机电量的展示效果。这一功能对于某些需要实时反馈进度的应用场景,如加载、下载等,尤其有用。 首先,我们从`progressbar`这个标签...
在移动应用或网页中,当图片从服务器下载到用户的设备上时,显示一个进度条可以有效地告诉用户操作正在进行,并且有助于缓解用户对加载时间过长的焦虑。 1. **进度条原理** 进度条通常是通过计算已下载的数据量与...
本文将深入探讨如何基于Android平台创建一个自定义的圆环进度条,这个进度条适用于文件上传、下载以及图片加载等场景。 首先,我们需要了解Android中的进度条(ProgressBar)组件。系统提供的ProgressBar有两种模式...
以下是一个简单的`AsyncTask`实现网络图片下载并显示进度的例子: ```java public class DownloadImageTask extends AsyncTask, Integer, Bitmap> { private ProgressBar progressBar; private ImageView ...
3. **图片下载与加载**:在Android中,我们通常使用第三方库如Picasso、Glide或Volley来加载网络图片。这些库支持异步加载,并且可以通过回调函数传递下载进度,从而更新自定义进度条的状态。 4. **AsyncTask**:...
在Android开发中,我们经常需要在ImageView中展示网络图片,并且在图片下载过程中提供一个进度条来提升用户体验,让用户知道图片加载的状态。"CoverLoading图片imageview下载进度条"就是一个解决此类需求的自定义...
4. **异步任务处理**:由于Android主线程不允许执行耗时操作,因此图片下载通常在子线程(AsyncTask、Thread、IntentService等)中进行。AsyncTask是Android提供的一种轻量级的异步处理类,适合处理一些短暂的后台...
在Android开发中,实现长按图片保存至相册的功能是一项常见的需求,它允许用户保存应用内显示的图片到他们的设备相册。下面我们将详细讨论如何实现这个功能,并结合提供的代码片段进行解析。 首先,我们需要监听...
Fresco使用了SurfaceView来显示图片,降低了内存消耗,同时提供了强大的动画和自定义缓存机制。 7. **线程池管理** - 使用`ExecutorService`和`ThreadPoolExecutor`进行线程池管理,可以有效地控制并发任务的数量...
在Android平台上,下载图片是一项常见的任务,特别是在开发与网络交互的应用时。本篇文章将深入探讨如何在Android中实现从URL加载并...通过实践和调试这些代码,你将更深入地掌握Android网络编程以及图片下载的技巧。
在Android开发中,为用户提供一个显示图片并且带有加载进度条的功能是常见的需求,尤其是在处理大图或者网络图片时。这个开源项目"带进度条的imageview",即"ProgressableImageView",旨在解决这一问题,提供了...
在描述中提到的"加载时有进度条显示,加载完进度条消失",这正是UIL库中的特性,可以通过设置监听器来控制进度条的显示与隐藏,提供用户友好的加载体验。 其次,ViewPager 是Android SDK中的一个视图容器,它允许...
1. **进度提示**:在图片上传过程中显示进度条,让用户了解上传进度。 2. **上传成功提示**:图片上传成功后,将其URL添加到评论实体的图片数组中,并更新UI显示。 3. **取消上传**:提供取消上传的选项,释放资源并...
常见的有线性进度条和圆形进度条。线性进度条通常显示在屏幕底部或顶部,以填充或移动的条形来代表加载的进度。圆形进度条则以环形或半环形填充来呈现,形象地表示百分比完成度。在本示例中,...
这个项目对于初学者来说是一个很好的学习资源,它揭示了如何在Android平台上实现网络浏览功能,并且在加载网页时展示进度条以提高用户体验。 首先,我们可以从标签“安卓 android”推测,这个项目是针对Android平台...
总之,这个项目涉及到了Android应用开发中的图片选择、图片处理、内存优化、视图适配等多个关键知识点,对于提升Android开发者在实际项目中的技能很有帮助。通过学习和实践,开发者可以更好地掌握如何在Android应用...
这个“Android应用源码带进度条简易浏览器项目”是一个典型的Android开发示例,它展示了如何在Android平台上构建一个简单的浏览器应用,并且集成了进度条功能,以提供用户友好的加载体验。下面,我们将深入探讨这个...
本教程将深入探讨如何利用Apache的HttpClient库实现文件上传,并且在上传过程中提供进度条接口,以便用户可以直观地看到文件传输的进度。我们将不依赖任何第三方jar包,而是直接对httpmime源码进行改造。 首先,...
在Android开发中,加载网络图片是一项常见的任务,而Fresco是一款强大的图像管理库,特别适合处理复杂的图片加载、缓存和显示问题。本教程将详细讲解如何在Android Studio项目中利用Fresco来加载网络上的静态图片和...