先看看效果图:
主类:
package com.tangzq;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
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 com.tangzq.Download_Progressbar_AsyncTask.MyAsyncTask;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.AsyncTask;
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.TextView;
public class Download_ProgressDialog_AsyncTask extends Activity implements OnClickListener {
private static final String LOG_TAG="Download_ProgressDialog_AsyncTask";
String imgHttp1="http://www.shaswatpatel.com/wp-content/uploads/2011/01/android-software.jpg";
private TextView txt;
private Button downImg;
private ImageView imgView;
private ProgressDialog progressDialog;
private Bitmap bitmap;
private static final String SDCARD="/sdcard/";
private String fileName="networkimg1.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.download_progressbar);
txt=(TextView)findViewById(R.id.txt);
downImg=(Button)findViewById(R.id.downImg);
downImg.setOnClickListener(this);
imgView=(ImageView)findViewById(R.id.imgView);
progressDialog=new ProgressDialog(this);
progressDialog.setTitle("图片下载");
progressDialog.setMessage("正在下载图片...");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
}
@Override
public void onClick(View paramView) {
new MyAsyncTask().execute(imgHttp1);
}
//保存图片方法
public void saveImg(String fullPath,Bitmap bitmap){
File file=new File(fullPath);
if(file.exists()){
file.delete();
}
try {
FileOutputStream fos=new FileOutputStream(file);
boolean isSaved=bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
if(isSaved){
fos.flush();
fos.close();
}
Log.e(LOG_TAG, "文件保存成功");
} catch (FileNotFoundException e) {
Log.e(LOG_TAG, "保存失败");
e.printStackTrace();
} catch (IOException e) {
Log.e(LOG_TAG, "保存失败");
e.printStackTrace();
}
}
//缩放图片方法
public Bitmap scaleBitmap(Bitmap oldBitmap,int newWidth,int newHeight){
//获取原始宽和高
int width=oldBitmap.getWidth();
int height=oldBitmap.getHeight();
//计算缩放比例
float scaleWidth=((float)newWidth)/width;
float scaleHeight=((float)newHeight)/height;
//取得要缩放的Maxtri参数
Matrix matrix=new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
//取得新的图片
Bitmap newBitmap=Bitmap.createBitmap(oldBitmap,0,0,width,height,matrix,true);
return newBitmap;
}
/**
*AsyncTask定义了三种泛型类型 Params,Progress和Result。
•Params 启动任务执行的输入参数,比如HTTP请求的URL。
•Progress 后台任务执行的百分比。
•Result 后台执行任务最终返回的结果,比如String
*如MyAsyncTask类的三个泛型参数:String,Integer,Bitmap
*/
class MyAsyncTask extends AsyncTask<String,Integer,Bitmap>{
@Override
protected Bitmap doInBackground(String... paramArrayOfParams) {
//super.run();
ByteArrayOutputStream bos=new ByteArrayOutputStream();
try {
URL url=new URL(paramArrayOfParams[0]);
HttpURLConnection con=(HttpURLConnection)url.openConnection();
con.setDoInput(true);
con.connect();
InputStream is=con.getInputStream();
//获取文件的大小
int maxSize=con.getContentLength();
int nowSize=0;
byte []buffer=new byte[1024];
int len=-1;
while((len=is.read(buffer))!=-1){
bos.write(buffer,0,len);
bos.flush();
nowSize+=len;
// 如果知道响应的长度,调用publishProgress()更新进度,传递进度给onProgressUpdate(...)方法
publishProgress(maxSize,nowSize);
}
//关闭输入流
is.close();
//关闭连接
con.disconnect();
byte []imgBytes=bos.toByteArray();
bitmap=BitmapFactory.decodeByteArray(imgBytes, 0, imgBytes.length);
} catch (MalformedURLException e) {
Log.e(LOG_TAG, "MalformedURLException");
e.printStackTrace();
} catch (IOException e) {
Log.e(LOG_TAG, "IOException");
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPreExecute() {
//首先清空图片和进度条
if(null!=bitmap){
imgView.setImageBitmap(null);
progressDialog.setProgress(0);
txt.setText("即将下载......");
}
//1、显示进度条
progressDialog.show();
}
@Override
protected void onPostExecute(Bitmap result) {
//下载完成后隐藏进度条
progressDialog.dismiss();
//显示图片
imgView.setImageBitmap(bitmap);
//显示缩放图
//imgView.setImageBitmap(scaleBitmap(result,200,200));
//将图片保存到sdcard中
saveImg(SDCARD+fileName,result);
//结束当前线程
}
/*
* 在publishProgress(...)方法被调用后,
* UI thread将调用这个方法传递的参数来更新界面上展示任务的进展情况
* 例如:更新进度条进行。
*/
@Override
protected void onProgressUpdate(Integer... values) {
progressDialog.setMax(values[0]);
txt.setText("已下载:"+(values[1]*100)/values[0]+"%");
Log.e(LOG_TAG, "正在下载:"+values[1]);
progressDialog.setProgress(values[1]);
}
}
}
download_progressbar.xml布局文件:
<?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" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="一步下载图片"
android:id="@+id/txt"/>
<Button
android:id="@+id/downImg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始下载图片" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imgView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="fill_parent"
style="?android:attr/progressBarStyleHorizontal"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="invisible"
/>
</FrameLayout>
</LinearLayout>
相关推荐
这个Demo,"Android-使用AsyncTask实现的多任务多线程下载的Demo支持断点续传",展示了如何高效且智能地管理下载过程。我们将深入探讨AsyncTask、多线程以及断点续传的概念。 首先,`AsyncTask`是Android提供的一种...
`AsyncTask`提供了一种在Android应用中简单而有效地利用UI线程的方法,它允许开发者执行后台操作并在UI线程上发布结果,而无需手动处理线程和Handler。 #### 二、AsyncTask的工作流程 当一个异步任务被执行时,...
本实例将探讨如何利用AsyncTask实现断点下载功能,这是一种允许用户在暂停后继续下载大文件的技术,极大地提高了用户体验。 首先,我们需要了解AsyncTask的结构。AsyncTask包含三个泛型参数:Params, Progress, ...
在Android应用开发中,异步处理是至关重要的,特别是在涉及到耗时操作如网络请求、数据库操作或文件I/O时。Android提供了一种便捷的机制,名为`AsyncTask`,用于在后台线程执行这些任务,同时允许在主线程更新UI。`...
在这个Demo中,开发者利用AsyncTask来处理文件下载的逻辑,以实现多任务并行和线程间的协同工作。 1. **多任务处理**:在Android中,可能有多个任务需要同时执行,如下载多个文件。为了防止阻塞主线程,开发者可以...
AsyncTask 的内部实现利用了线程池,能有效管理并发任务,避免过多的线程创建。然而,由于其简单的线程模型,当大量任务并发时,可能会导致性能问题。因此,对于需要处理大量并发任务的情况,开发者可能需要考虑使用...
在本例中,我们将探讨如何利用`AsyncTask`实现断点续传功能。 断点续传是一种文件传输技术,允许用户在文件下载中断后从上次停止的地方继续下载,而不是从头开始。这对于大型文件来说非常有用,因为它节省了用户的...
《Android-Sip2Peer-1.0:探索P2P通信技术在...通过深入研究该项目的源码,开发者可以学习到Android上的SIP应用开发、P2P网络实现、音视频处理、网络通信以及安全策略等多个方面的知识,对提升自身技能大有裨益。
在这个项目"Androidstudio写的异步加载下载网络图片"中,开发者使用了`AsyncTask`这一Android内置的异步处理工具来实现网络图片的下载功能。 `AsyncTask`是Android提供的一种轻量级的异步处理类,它简化了在UI线程...
在Android开发中,从网络下载图片是一项常见的任务,特别是在构建应用程序时,比如社交应用、电商应用等。本文将深入探讨三种不同的方法来实现这一功能:Handler、AsyncTask以及线程池。 1. Handler机制下载图片: ...
在Android开发中,`AsyncTask`是一个非常重要的概念,它为开发者提供了一种方便的机制来执行后台操作,同时能够更新UI线程。这个框架设计的初衷是解决Android应用程序中的多线程问题,特别是那些需要在后台处理耗时...
4. **内存泄漏**:静态变量引用的AsyncTask实例可能导致内存泄漏,尤其是在Activity中。避免这种情况的一个好方法是使用弱引用。 5. **使用限制**:由于AsyncTask的设计和实现,它并不适合非常复杂的后台任务。对于...
本实例"Android-SQLite实例实现简易词典"旨在教你如何利用SQLite创建一个简单的词典应用,其中包括单词的添加、查询功能,并结合ListView展示查询结果。以下是关于SQLite在Android中应用的详细知识点: 1. **...
通过以上步骤,我们可以构建一个完整的Android电商购物车实例。这个过程涵盖了Android开发的多个方面,从数据获取到界面展示,再到用户体验和性能优化,都需要开发者具备扎实的技术基础和良好的编程习惯。
【Android Gallery照片墙画廊图库相关...对于初学者来说,这是一个很好的学习机会,可以深入理解Android图片加载、滑动效果的实现以及自定义组件的开发。通过阅读和分析代码,可以提升对Android系统的理解和编程技能。
- **通知与推送**:利用Firebase Cloud Messaging (FCM) 实现消息推送。 3. **Android实例分析** 深入学习这些实例,开发者可以掌握如何组织项目结构、创建Activity、处理用户事件、响应生命周期变化、设计自定义...
Android 提供了 `AsyncTask` 类来执行后台操作,它非常适合处理轻量级的异步任务,如加载小尺寸的网络图片。`AsyncTask` 包含三个泛型参数,分别代表输入类型、进度类型和输出类型。在 `doInBackground()` 方法中...
当需要显示图片时,首先检查`LruCache`中是否存在该图片,如果存在则直接取出使用,如果不存在,则从网络下载图片,将下载后的Bitmap放入`LruCache`,然后显示。这样可以避免频繁的网络请求,提高用户体验。 接下来...
【标题】"Android Studio基础实例代码完整可执行代码.zip" 提供的是Android Studio开发的基础实践案例,包含了完整的、可运行的源代码。这个压缩包可能是为了帮助初学者深入理解Android应用开发过程,或者是为了补充...
本项目“安卓Gallery照片墙画廊图库相关-Android利用Gallery和ImageSwitcher实现在线相册图片预览功能异步加载图片”就是针对这种场景的一个实例。在这个项目中,开发者使用了`Gallery`组件和`ImageSwitcher`来实现...