android的AsyncTask使用方法-多线程下载

原创 2013年12月05日 01:03:52

public class MainActivity extends Activity implements OnClickListener {
	private Button btn1, btn2, btn3;
	private ProgressBar progressBar1, progressBar2, progressBar3;
	private ImageView img1, img2, img3;
	private static final String IMG_URI = "http://csdnimg.cn/www/images/csdnindex_logo.gif";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		initListener();
	}

	/**
	 * 初始化监听器
	 */
	private void initListener() {
		btn1.setOnClickListener(this);
		btn2.setOnClickListener(this);
		btn3.setOnClickListener(this);
	}

	/**
	 * 
	 * 初始化控件
	 */
	private void initView() {
		btn1 = (Button) findViewById(R.id.btn1);
		btn2 = (Button) findViewById(R.id.btn2);
		btn3 = (Button) findViewById(R.id.btn3);
		progressBar1 = (ProgressBar) findViewById(R.id.progressbar1);
		progressBar2 = (ProgressBar) findViewById(R.id.progressbar2);
		progressBar3 = (ProgressBar) findViewById(R.id.progressbar3);
		img1 = (ImageView) findViewById(R.id.img1);
		img2 = (ImageView) findViewById(R.id.img2);
		img3 = (ImageView) findViewById(R.id.img3);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onClick(View arg0) {
		// 点击按钮模拟下载
		MyDownloadAsy down = new MyDownloadAsy();
		down.execute(IMG_URI, arg0.getId() + "");

	}

	/**
	 * 1.Params,传递给后台任务的参数类型。
	 * 
	 * 2.Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)
	 * 
	 * 3.Result, 后台执行返回的结果的类型。
	 */
	class MyDownloadAsy extends AsyncTask<String, Integer, Bitmap> {
		private static final String TAG = "asy";
		private int clickBtn = 0;

		private void i(String object) {
			Log.i(TAG, object);
		}

		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			i("準備運行線程");
			progressBar1.setProgress(0);// 进度条复位
			progressBar2.setProgress(0);// 进度条复位
			progressBar3.setProgress(0);// 进度条复位
		}

		@Override
		protected Bitmap doInBackground(String... arg0) {
			switch (Integer.parseInt(arg0[1])) {
			case R.id.btn1:
				clickBtn = 1;
				break;
			case R.id.btn2:
				clickBtn = 2;
				break;
			case R.id.btn3:
				clickBtn = 3;
				break;

			default:
				break;
			}
			i("正在后台执行");
			publishProgress(0);
			// 下载图片
			HttpClient hc = new DefaultHttpClient();
			// 等待2s
			sleepWait();
			publishProgress(50);
			HttpGet hg = new HttpGet(arg0[0]);// 获取csdn的logo
			final Bitmap bm;
			try {
				HttpResponse hr = hc.execute(hg);
				bm = BitmapFactory.decodeStream(hr.getEntity().getContent());
			} catch (Exception e) {

				return null;
			}
			sleepWait();
			publishProgress(100);
			// mImageView.setImageBitmap(result); 不能在后台线程操作ui
			return bm;
		}

		/**
		 * 等待2s钟
		 */
		private void sleepWait() {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}

		protected void onProgressUpdate(Integer... values) {
			// 动态更新

			i("進度更新");
			switch (clickBtn) {
			case 1:
				progressBar1.setProgress(values[0]);// 更新进度条的进度
				break;
			case 2:
				progressBar2.setProgress(values[0]);// 更新进度条的进度
				break;
			case 3:
				progressBar3.setProgress(values[0]);// 更新进度条的进度
				break;

			default:
				break;
			}

		}

		protected void onPostExecute(Bitmap result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			i("线程执行完成");
			if (result != null) {
				i("下载图片成功");
				switch (clickBtn) {
				case 1:
					img1.setImageBitmap(result);
					break;
				case 2:
					img2.setImageBitmap(result);
					break;
				case 3:
					img3.setImageBitmap(result);
					break;

				default:
					break;
				}

			} else {
				i("下载图片失败");
			}
		}

		@Override
		protected void onCancelled() {
			// TODO Auto-generated method stub
			super.onCancelled();
			i("取消线程");
			switch (clickBtn) {
			case 1:
				progressBar1.setProgress(0);// 进度条复位
				break;
			case 2:
				progressBar2.setProgress(0);// 进度条复位
				break;
			case 3:
				progressBar3.setProgress(0);// 进度条复位
				break;

			default:
				break;
			}

		}
	}
}

xml:

<RelativeLayout 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=".MainActivity" >

    <TableLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true" >

        <TableRow>

            <Button
                android:id="@+id/btn1"
                android:text="@string/btn1" />

            <ProgressBar
                android:id="@+id/progressbar1"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />

            <ImageView
                android:id="@+id/img1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@id/img1"
                android:src="@drawable/ic_launcher" />
        </TableRow>

        <TableRow>

            <Button
                android:id="@+id/btn2"
                android:text="@string/btn2" />

            <ProgressBar
                android:id="@+id/progressbar2"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />

            <ImageView
                android:id="@+id/img2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@id/img2"
                android:src="@drawable/ic_launcher" />
        </TableRow>

        <TableRow>

            <Button
                android:id="@+id/btn3"
                android:text="@string/btn3" />

            <ProgressBar
                android:id="@+id/progressbar3"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />

            <ImageView
                android:id="@+id/img3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@id/img3"
                android:src="@drawable/ic_launcher" />
        </TableRow>
    </TableLayout>

</RelativeLayout>

AndroidManifast:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xunfang.asynctackdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="10" />
    <!-- 访问网络的权限 -->

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.xunfang.asynctackdemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


Android AsyncTask多任务多线程断点续传下载

转至:http://www.cnblogs.com/liuling/archive/2015/10/16/2015-10-16-01.html 这篇博客是AsyncTask下载系列的最后一篇...
  • h183288132
  • h183288132
  • 2016年03月22日 11:43
  • 519

Android中如何处理耗时操作,AsyncTask有什么不足之处.

Android中处理耗时操作的基本思路为将耗时的操作放到非UI线程执行.常用的是AsyncTask,Handler,Thread,Executors等.关于放在非UI线程处理的思路大概有这样几种,一种...
  • biezhihua
  • biezhihua
  • 2016年08月30日 10:48
  • 1612

Android之AsyncTask的内存泄露问题

AsyncTask是Android提供的一种用于异步处理数据的异步类,使用AsyncTask可以不用直接使用Thread和Handler来处理后台操作。AsyncTask被引入到Android中就被贴...
  • LoveYaozu
  • LoveYaozu
  • 2016年04月25日 22:41
  • 2833

源码解析Android中AsyncTask的工作原理

在之前的博客《Android中AsyncTask使用详解》中我们提到AsyncTask是对Thread和Handler的组合包装,本文将通过解析的方式让大家了解AsyncTask的工作原理。Async...
  • sunqunsunqun
  • sunqunsunqun
  • 2016年02月17日 23:03
  • 10011

Android实现弱引用AsyncTask,将内存泄漏置之度外。

AsyncTask可谓是在Android中隐藏很深,曾经叱咤风云的功夫级人物。它的存在让网络和UI的通信变得异常简单和轻松。AsyncTask使用上的简单也得以让很多开发者青睐。一般情况下,Async...
  • u013718120
  • u013718120
  • 2016年11月04日 11:50
  • 2890

Android之AsyncTask的使用(二)之文件下载

声明: 本人菜鸟一枚, 本博客是本人自学的内容, 适用于初学者, 不喜勿喷, 谢谢大家下载案例 AsyncTask准则 通过上一篇博客我们学习到了AsyncTask的主要作用, 那今天就写一个实际...
  • u013144863
  • u013144863
  • 2016年07月07日 22:41
  • 1310

android 取消AsyncTask继续运行的解决方案

问题 当进入一个详细页面,这时程序会弹出一个对话框加载网络数据,可是发现用户经常因为数据加载慢,就快速的退出这个页面,这样反复来回几次后,发现AsyncTask不再继续加载,而是慢慢的等待,查了下个...
  • u011467537
  • u011467537
  • 2015年12月08日 10:25
  • 1777

android两种方式获取AsyncTask返回值

获取AsyncTask返回值,在Activity中使用。 标签:  代码片段(4)[全屏查看所有代码] 1. [代码][Java]代码      ? 1 2 3...
  • H_shaohui
  • H_shaohui
  • 2017年04月18日 10:10
  • 1035

Android AsyncTask导致的内存泄漏

一般我们都认为,在一个Activity中的AsyncTask它会随着当前Activity的销毁而销毁,但事实并非如此,AsyncTask会在doInBackground()方法执行完毕之后再结束,所有...
  • litetaure
  • litetaure
  • 2017年04月06日 15:59
  • 695

Android AsyncTask 源码解析

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38614699,本文出自:【张鸿洋的博客】1、概述相信大家对AsyncTask都不...
  • lmj623565791
  • lmj623565791
  • 2014年08月18日 09:10
  • 29139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android的AsyncTask使用方法-多线程下载
举报原因:
原因补充:

(最多只允许输入30个字)