`
dyingbleed
  • 浏览: 117248 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
社区版块
存档分类
最新评论

【Android】AsyncTask实现异步处理

阅读更多

AsyncTask提供了简单易用的方式,执行后台操作并更新UI。


AsyncTask的3个泛型

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

AsyncTask的4个步骤

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

示例代码:

 

下载远端资源,需要INTERNET权限
将资源写入到SD,需要WRITE_EXTERNAL_STORAGE权限
在AndroidManifest.xml中进行如下配置

 

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


功能:

异步下载,并根据下载进步更新ProgresBar,下载完成后显示图像

 

package lizhen.download;

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);

		} 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) 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);
            publishProgress(progress);
        }
        in.close();
        fileOutputStream.close();
	}
	
	/**
	 * 根據資源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;
	}
	
}

 

package lizhen.download;

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 source = "http://192.168.211.86/comic/test.jpg"; //源文件地址
	private final String path = Environment.getExternalStorageDirectory().toString()+"/test.jpg"; //目標文件地址
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.download);
        
        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(source, path); 
			}
		});
    }
    
    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(path);
				downloadImageView.setImageBitmap(bitmap);
			} else {
				Toast.makeText(Download.this, "Error: "+errorMessage, 1000).show();
			}
		}    	
    }
}

 

运行结果:

运行结果

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

相关推荐

    Android AsyncTask实现异步处理任务的方法详解

    "Android AsyncTask实现异步处理任务的方法详解" Android AsyncTask是Android操作系统提供的一个工具类,用于实现异步处理任务的方法详解。AsyncTask是抽象类,定义了三种泛型类型 Params,Progress和Result。...

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

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

    Android AsyncTask异步处理下载网页

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

    android:AsyncTask实现异步处理任务.pdf

    总之,AsyncTask为Android开发者提供了一种简洁的方式,处理耗时操作和UI更新,使得异步编程更加直观和易于管理。但要注意,随着Android版本的更新,对于大型或者复杂的异步任务,推荐使用更现代的解决方案,如`...

    Android AsyncTask(异步) 简单样例

    在Android开发中,异步...总之,理解并熟练使用Android AsyncTask对于Android开发者来说至关重要,但也要根据项目需求选择最适合的异步处理方式。在实际开发中,我们应灵活运用各种工具,确保应用的性能和用户体验。

    Android开发AsyncTask异步处理任务

    这个博文主要围绕Android开发中的AsyncTask展开,讨论了如何利用它来异步处理任务。 AsyncTask是Android提供的一个轻量级异步处理框架,适用于快速、简短的后台任务,例如网络请求、数据库操作等。它的核心设计思想...

    Android 使用AsyncTask异步更新UI界面

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

    Android Handler AsyncTask 异步加载

    在Android应用开发中,Handler、AsyncTask和异步加载是三个关键的概念,它们主要...在实际开发中,根据具体场景选择合适的方法,同时关注Android API的变化,适时引入新的异步处理工具,是保持代码高效、稳定的关键。

    02_AsyncTask_简单演示AsyncTask异步操作

    AsyncTask_简单演示AsyncTask异步操作,写一个简单的AsyncTask异步操作解决上一篇文章提到的线程阻塞问题,对应我的博客《网易博客迁移:Android专题之AsyncTask(二)简单演示AsyncTask异步操作》,有问题欢迎留言...

    Android用AsyncTask异步加载图片(新)

    在Android应用开发中,异步加载图片是一项常见的需求,特别是在处理大数据量的图像时,如在GridView或ListView中展示图片。`AsyncTask`是Android提供的一种轻量级的多线程解决方案,它允许开发者在后台执行耗时操作...

    Android异步处理二:使用AsyncTask异步更新UI界面

    Android异步处理二:使用AsyncTask异步更新UI界面。

    Android AsyncTask 异步下载 提高篇

    `AsyncTask`是Android提供的一种轻量级的异步处理机制,特别适用于执行耗时操作,如网络请求、数据库操作或图片下载等。在本教程“Android AsyncTask 异步下载 提高篇”中,我们将深入探讨`AsyncTask`的高级用法和...

    Android的AsyncTask异步任务

    本篇文章将深入探讨Android的AsyncTask异步任务,以及如何在实践中应用。 首先,Android是一个基于事件驱动的系统,主线程(UI线程)负责处理用户交互,而复杂的计算或网络请求等耗时操作应在后台线程中执行,以免...

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

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

    Android AsyncTask 异步下载基础篇

    在Android应用开发中,异步处理是至关重要的,因为它能够避免主线程被阻塞,从而提升用户体验。`AsyncTask`是Android提供的一种轻量级的异步任务处理框架,特别适用于执行耗时的操作,如网络请求、文件下载或图片...

    Android AsyncTask 源码解析

    通过以上对 AsyncTask 的源码解析和使用方法的介绍,你应该对如何在 Android 应用中高效地使用异步任务有了更深入的理解。在实际开发中,正确理解和使用 AsyncTask 可以帮助我们编写出更加流畅、响应快速的应用程序...

    Android中异步类AsyncTask用法总结

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

    Android studio异步数据加载ListView+Adapter+AsyncTask

    本教程将详细讲解如何在Android Studio中结合ListView、Adapter和AsyncTask实现异步数据加载。 首先,我们需要了解ListView的基本用法。ListView是一种可以滚动并显示多个同种类型的视图组件,通过Adapter进行数据...

    安卓图片加载缓存相关-AsyncTask的使用及ListView的常见优化asyncTask异步加载数据使用了LruCache优化图片加载通过滑动监听提高ListView滑动流畅度.rar

    AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...

Global site tag (gtag.js) - Google Analytics