关闭

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

1481人阅读 评论(0) 收藏 举报
分类:

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>


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:637376次
    • 积分:6354
    • 等级:
    • 排名:第3976名
    • 原创:184篇
    • 转载:29篇
    • 译文:0篇
    • 评论:77条
    文章分类
    最新评论