`
tzq668766
  • 浏览: 81554 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

android-完整利用AsyncTask实现网络图片下载的实例

 
阅读更多

先看看效果图:



 



主类:

 

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>

 

 


0
0
分享到:
评论

相关推荐

    Android-使用AsyncTask实现的多任务多线程下载的Demo支持断点续传。

    这个Demo,"Android-使用AsyncTask实现的多任务多线程下载的Demo支持断点续传",展示了如何高效且智能地管理下载过程。我们将深入探讨AsyncTask、多线程以及断点续传的概念。 首先,`AsyncTask`是Android提供的一种...

    AndEngine_分析之三-----AsyncTask_BaseActivity备忘

    `AsyncTask`提供了一种在Android应用中简单而有效地利用UI线程的方法,它允许开发者执行后台操作并在UI线程上发布结果,而无需手动处理线程和Handler。 #### 二、AsyncTask的工作流程 当一个异步任务被执行时,...

    android AsyncTask 断点下载实例

    本实例将探讨如何利用AsyncTask实现断点下载功能,这是一种允许用户在暂停后继续下载大文件的技术,极大地提高了用户体验。 首先,我们需要了解AsyncTask的结构。AsyncTask包含三个泛型参数:Params, Progress, ...

    Android AsyncTask异步处理下载网页

    在Android应用开发中,异步处理是至关重要的,特别是在涉及到耗时操作如网络请求、数据库操作或文件I/O时。Android提供了一种便捷的机制,名为`AsyncTask`,用于在后台线程执行这些任务,同时允许在主线程更新UI。`...

    人工智能-项目实践-多任务-使用AsyncTask实现的多任务多线程下载的Demo,支持断点续传.zip

    在这个Demo中,开发者利用AsyncTask来处理文件下载的逻辑,以实现多任务并行和线程间的协同工作。 1. **多任务处理**:在Android中,可能有多个任务需要同时执行,如下载多个文件。为了防止阻塞主线程,开发者可以...

    Android中异步类AsyncTask用法总结

    AsyncTask 的内部实现利用了线程池,能有效管理并发任务,避免过多的线程创建。然而,由于其简单的线程模型,当大量任务并发时,可能会导致性能问题。因此,对于需要处理大量并发任务的情况,开发者可能需要考虑使用...

    Asynctask实现断点续传

    在本例中,我们将探讨如何利用`AsyncTask`实现断点续传功能。 断点续传是一种文件传输技术,允许用户在文件下载中断后从上次停止的地方继续下载,而不是从头开始。这对于大型文件来说非常有用,因为它节省了用户的...

    Android应用源码之Android-Sip2Peer-1.0 实现p2p.zip

    《Android-Sip2Peer-1.0:探索P2P通信技术在...通过深入研究该项目的源码,开发者可以学习到Android上的SIP应用开发、P2P网络实现、音视频处理、网络通信以及安全策略等多个方面的知识,对提升自身技能大有裨益。

    Androidstudio写的异步加载下载网络图片

    在这个项目"Androidstudio写的异步加载下载网络图片"中,开发者使用了`AsyncTask`这一Android内置的异步处理工具来实现网络图片的下载功能。 `AsyncTask`是Android提供的一种轻量级的异步处理类,它简化了在UI线程...

    android下载网络图片的方法

    在Android开发中,从网络下载图片是一项常见的任务,特别是在构建应用程序时,比如社交应用、电商应用等。本文将深入探讨三种不同的方法来实现这一功能:Handler、AsyncTask以及线程池。 1. Handler机制下载图片: ...

    模范Android中的AsyncTask

    在Android开发中,`AsyncTask`是一个非常重要的概念,它为开发者提供了一种方便的机制来执行后台操作,同时能够更新UI线程。这个框架设计的初衷是解决Android应用程序中的多线程问题,特别是那些需要在后台处理耗时...

    Android开发之AsyncTask机制及使用细节例子源码

    4. **内存泄漏**:静态变量引用的AsyncTask实例可能导致内存泄漏,尤其是在Activity中。避免这种情况的一个好方法是使用弱引用。 5. **使用限制**:由于AsyncTask的设计和实现,它并不适合非常复杂的后台任务。对于...

    Android-SQLite实例实现简易词典

    本实例"Android-SQLite实例实现简易词典"旨在教你如何利用SQLite创建一个简单的词典应用,其中包括单词的添加、查询功能,并结合ListView展示查询结果。以下是关于SQLite在Android中应用的详细知识点: 1. **...

    Android-实现一个Android电商购物车实例

    通过以上步骤,我们可以构建一个完整的Android电商购物车实例。这个过程涵盖了Android开发的多个方面,从数据获取到界面展示,再到用户体验和性能优化,都需要开发者具备扎实的技术基础和良好的编程习惯。

    安卓Gallery照片墙画廊图库相关-android-image-slide-panel图片照片墙的加载和滑动特效.rar

    【Android Gallery照片墙画廊图库相关...对于初学者来说,这是一个很好的学习机会,可以深入理解Android图片加载、滑动效果的实现以及自定义组件的开发。通过阅读和分析代码,可以提升对Android系统的理解和编程技能。

    Android Studio实例代码.zip_Android app实例_Android实例_android app源码_and

    - **通知与推送**:利用Firebase Cloud Messaging (FCM) 实现消息推送。 3. **Android实例分析** 深入学习这些实例,开发者可以掌握如何组织项目结构、创建Activity、处理用户事件、响应生命周期变化、设计自定义...

    android异步加载网络图片实例

    Android 提供了 `AsyncTask` 类来执行后台操作,它非常适合处理轻量级的异步任务,如加载小尺寸的网络图片。`AsyncTask` 包含三个泛型参数,分别代表输入类型、进度类型和输出类型。在 `doInBackground()` 方法中...

    Android Lrucache加载图片(AsyncTask )

    当需要显示图片时,首先检查`LruCache`中是否存在该图片,如果存在则直接取出使用,如果不存在,则从网络下载图片,将下载后的Bitmap放入`LruCache`,然后显示。这样可以避免频繁的网络请求,提高用户体验。 接下来...

    android studio基础实例代码完整可执行代码.zip

    【标题】"Android Studio基础实例代码完整可执行代码.zip" 提供的是Android Studio开发的基础实践案例,包含了完整的、可运行的源代码。这个压缩包可能是为了帮助初学者深入理解Android应用开发过程,或者是为了补充...

    安卓Gallery照片墙画廊图库相关-Android利用Gallery和ImageSwitcher实现在线相册图片预览功能异步加载图片.rar

    本项目“安卓Gallery照片墙画廊图库相关-Android利用Gallery和ImageSwitcher实现在线相册图片预览功能异步加载图片”就是针对这种场景的一个实例。在这个项目中,开发者使用了`Gallery`组件和`ImageSwitcher`来实现...

Global site tag (gtag.js) - Google Analytics