`

android使用AsyncTask下载远端网络资源到SD卡

 
阅读更多
<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Download" 
    android:orientation="vertical">


    <Button
        android:id="@+id/download_StartButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="开始下载" />
    
    <ProgressBar
        android:id="@+id/download_ProgressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="203dp"
        android:layout_height="40dp" />
    
    <TextView  android:id="@+id/download_ProgressTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"/>
    
    <ImageView android:id="@+id/download_ImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"/>
      

</LinearLayout>

    

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

    

package com.example.drawableimgasynctask;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
 
public class Download extends Activity {
 
    private Button startButton;
    private ProgressBar downloadProgressBar;
    private TextView progressTextView;
    private ImageView downloadImageView;
 
    private final String mSource = "http://d3gtl9l2a4fn1j.cloudfront.net/t/p/original/wYdFAUyCApeUbfWWP0YMsu6b4hs.jpg";// 源文件地址
    private final String mPath = Environment.getExternalStorageDirectory()
            .toString() + "/imga.gif"; // 目标文件地址
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        startButton = (Button) findViewById(R.id.download_StartButton);
        downloadProgressBar = (ProgressBar) findViewById(R.id.download_ProgressBar);
        progressTextView = (TextView) findViewById(R.id.download_ProgressTextView);
        downloadImageView = (ImageView) findViewById(R.id.download_ImageView);
        startButton.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                new DownloadTask().execute(mSource, mPath);
            }
        });
    }
 
    private class DownloadTask extends DownloadAsyncTask {
 
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            int progress = values[0];
            /*
             * 更新进度条和下载百分率
             */
            downloadProgressBar.setMax(size);
            downloadProgressBar.setProgress(progress);
            int percentage = progress * 100 / size;
            progressTextView.setText("已完成" + percentage + "%");
        }
 
        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            if (result) {
                Bitmap bitmap = BitmapFactory.decodeFile(mPath);
                downloadImageView.setImageBitmap(bitmap);
            } else {
                Toast.makeText(Download.this, "Error: " + errorMessage, 1000)
                        .show();
            }
        }
    }
}

 

   

package com.example.drawableimgasynctask;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
 
import android.os.AsyncTask;
 
public class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {
 
    protected int size;
    protected String errorMessage;
 
    @Override
    protected Boolean doInBackground(String... params) {
        String url = params[0]; // 资源地址
        String path = params[1]; // 目标路径
        try {
            InputStream source = requestInputStream(url); // 请求源文件InputStream
            /**
             * 创建文件写入数据,并更新进度
             */
            fileWrite(source, path, new OnProgressUpdateListener() {
 
                @Override
                public void onProgressUpdate(int progress) {
                    publishProgress(progress);
                }
            });
 
        } catch (ClientProtocolException e) {
            errorMessage = e.getMessage();
            cancel(true);
            return false;
        } catch (IOException e) {
            errorMessage = e.getMessage();
            cancel(true);
            return false;
        }
        return true;
    }
 
    /**
     * 文件写入
     *
     * @param in
     *            数据源输出流
     * @param path
     *            文件路径
     * @param listener
     *            下载进度监听器
     * */
    private void fileWrite(InputStream in, String path,
            OnProgressUpdateListener listener) throws IOException {
        File file = createFile(path);
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        byte buffer[] = new byte[1024];
        int progress = 0;
        int readBytes = 0;
        while ((readBytes = in.read(buffer)) != -1) {
            progress += readBytes;
            fileOutputStream.write(buffer, 0, readBytes);
            if (listener != null) {
                listener.onProgressUpdate(progress);
            }
        }
        in.close();
        fileOutputStream.close();
    }
 
    /**
     * 下载进度监听器
     * */
    private interface OnProgressUpdateListener {
        /**
         * 下载进度更新
         *
         * @param progress
         *            进度
         * */
        public void onProgressUpdate(int progress);
    }
 
    /**
     * 根据资源URL地址取得资源输入流
     *
     * @param url
     *            URL地址
     * @return 资源输入流
     * @throws ClientProtocolException
     * @throws IOException
     * */
    private InputStream requestInputStream(String url)
            throws ClientProtocolException, IOException {
        InputStream result = null;
        HttpGet httpGet = new HttpGet(url);
        HttpClient httpClient = new DefaultHttpClient();
        HttpResponse httpResponse = httpClient.execute(httpGet);
        int httpStatusCode = httpResponse.getStatusLine().getStatusCode();
        if (httpStatusCode == HttpStatus.SC_OK) {
            HttpEntity httpEntity = httpResponse.getEntity();
            size = (int) httpEntity.getContentLength();
            result = httpEntity.getContent();
        }
        return result;
    }
 
    /**
     * 根据文件路径创建文件
     *
     * @param path
     *            文件路径
     * @return 文件File实例
     * @return IOException
     * */
    private File createFile(String path) throws IOException {
        File file = new File(path);
        file.createNewFile();
        return file;
    }
 
    /**
     * 返回错误信息
     *
     * @return 错误信息
     * */
    public String getErrorString() {
        return this.errorMessage;
    }
 
}

 

AsyncTask的3个泛型

• Param  传入数据类型
• Progress  更新UI数据类型
• Result  处理结果类型

AsyncTask的4个步骤

1、onPreExecute  执行前的操作
2、doInBackGround  后台执行的操作
3、onProgressUpdate  更新UI操作
4、onPostExecute  执行后的操作

从网络下载资源到SD卡的步骤:

1、HTTP请求资源InputStream
2、在SD中创建一个空文件
3、创建该文件的FileOutputStream
4、使用while循环,InputStream每次循环读入数据到字节数组buffer中(buffer字节数组的大小一般为1024的整数倍),FileOutputStream将buffer中的数据写入文件,直到EOF,read()方法返回-1

 

下载网络资源到本地

  运行结果:

 



 

 

  • 大小: 84.5 KB
1
0
分享到:
评论

相关推荐

    Android AsyncTask异步处理下载网页

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

    AsyncTask下载网络图片

    `AsyncTask`是Android提供的一种轻量级异步处理机制,它非常适合用来进行网络图片的下载操作。本篇文章将深入探讨如何利用`AsyncTask`实现网络图片的下载,并分享相关知识点。 首先,我们要理解`AsyncTask`的基本...

    android AsyncTask 断点下载实例

    通过这种方式,我们可以使用Android的AsyncTask实现断点下载功能,确保用户在任何时候都能无缝继续他们的下载。同时,注意AsyncTask仅适用于较短的后台操作,对于长时间运行的任务,考虑使用IntentService或Job...

    Android AsyncTask用法和异步加载图片.rar

    在Android应用开发中,异步处理是至关重要的,特别是在处理耗时操作如网络请求或大量数据计算时。Android提供了一种轻量级的机制来在后台执行这些任务,即`AsyncTask`。本资料包主要讲解了如何使用`AsyncTask`进行...

    Android 使用AsyncTask异步更新UI界面

    为了在主线程之外执行耗时操作,比如网络请求或数据库查询,Android提供了多种异步处理机制,其中`AsyncTask`是早期常用的一种。本文将详细探讨如何在Android中使用`AsyncTask`来异步更新UI界面。 ### 一、...

    AsyncTask 网络下载文件

    1,实现android AsyncTask异步网络下载文件 2,AsyncTask的详细用法,有详细的注解 3,ProgressBar水平滚动条的动态实现方式,与正在下载文件的多少关联滚动条的进度多少。 4,可以中途取消下载文件

    android中AsyncTask的用法

    在Android应用开发中,AsyncTask是一个用于在后台线程执行耗时操作并更新UI的工具类,它是Android 1.5版本引入的。AsyncTask的设计初衷是为了简化异步编程,避免直接操作线程和Handler带来的复杂性。下面我们将详细...

    Android AsyncTask Demo 自己参考网络写的学习 demo

    在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,同时在UI线程更新进度或结果。这个“Android AsyncTask Demo”是开发者为了学习和理解AsyncTask工作原理而编写的示例代码。下面我们将...

    在Android中使用AsyncTask和Handler线程间交互的方式

    在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html

    Android AsyncTask 源码解析

    在提供的 `zhy_asynctask_demo01` 文件中,我们可以找到一个简单的 AsyncTask 示例,它演示了如何使用 AsyncTask 来下载文件。这个例子涵盖了从初始化任务、执行任务到处理结果的完整流程,是理解和学习 AsyncTask ...

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

    AsyncTask的使用和内部机制对于任何Android开发者来说都至关重要。让我们深入探讨这个话题。 首先,Android系统为了解决长时间运行的任务在主线程执行导致的UI冻结问题,提供了AsyncTask。AsyncTask分为三个基本...

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

    本篇文章将详细探讨如何使用`AsyncTask`来实现网络图片的下载,并且展示进度条提示。 `AsyncTask`有三个泛型参数,分别是Params、Progress和Result。Params表示后台任务接收的输入参数类型,Progress表示后台任务的...

    AsyncTask下载网络图片 对话框提示

    总之,使用AsyncTask下载网络图片并显示对话框提示,是一个典型的Android异步处理和UI更新的场景。正确地使用AsyncTask可以确保用户界面的流畅性,避免因长时间阻塞主线程而引发的ANR(应用程序无响应)错误。在实际...

    Android AsyncTask 下载图片

    在Android应用开发中,异步处理是至关重要的,特别是在涉及到网络操作时,如下载图片。Android的`AsyncTask`类就是一个轻量级的工具,用于在后台线程执行耗时任务,然后在UI线程更新结果,从而避免了主线程(UI线程...

    android中使用AsyncTask实现下载、停止、暂停、继续

    先申明啊,我这个小功能使用的下载地址是使用自己电脑上的Tomacat做的服务器,不会搭建服务器不会看代码的人不要在这里叫不能运行啊 // 给统一列表项的下载、停止、暂停、继续、进度条控件设置相同的Tag btn_...

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

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

    Android中异步类AsyncTask用法总结

    AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。它简化了多线程编程,尤其是与用户界面交互的需求。 首先,AsyncTask 包含三个泛型...

    通过AsyncTask获取网络资源

    在这个例子中,我们学习了如何使用`AsyncTask`来获取网络资源,解析数据,并将结果显示在`TextView`上,这在很多简单的Android应用中是非常常见的做法。然而,为了应对更复杂的需求和保持代码的可维护性,开发者应当...

    Android最全最简单的异步任务AsyncTask使用解析

    Android异步任务AsyncTask使用解析 Android异步任务AsyncTask使用解析是指在Android应用程序中使用AsyncTask来实现异步任务的处理。AsyncTask是一个抽象类,使用时需要继承这个类,然后调用execute()方法。...

    Android Handler AsyncTask 异步加载

    在Android应用开发中,Handler、AsyncTask和异步加载是三个关键的概念,它们主要用于解决UI线程阻塞问题,提高应用程序的响应速度和用户体验。下面将详细解释这三个概念及其相互关系。 **Handler(处理器)** ...

Global site tag (gtag.js) - Google Analytics