Welcome 微信登录

首页 / 移动开发 / Android / Android使用AsyncTask实现多线程下载的方法

本文实例讲述了Android使用AsyncTask实现多线程下载的方法。分享给大家供大家参考,具体如下:
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://www.jb51.net/images/logo.gif";@Overrideprotected 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);}@Overridepublic 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;}@Overridepublic 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);}@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();i("準備運行線程");progressBar1.setProgress(0);// 进度条复位progressBar2.setProgress(0);// 进度条复位progressBar3.setProgress(0);// 进度条复位}@Overrideprotected 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();// 等待2ssleepWait();publishProgress(50);HttpGet hg = new HttpGet(arg0[0]);// 获取jb51的logofinal 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); 不能在后台线程操作uireturn bm;}/** * 等待2s钟 */private void sleepWait() {try {Thread.sleep(2000);} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.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 stubsuper.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("下载图片失败");}}@Overrideprotected void onCancelled() {// TODO Auto-generated method stubsuper.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" ><TableLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_centerHorizontal="true" ><TableRow><Buttonandroid:id="@+id/btn1"android:text="@string/btn1" /><ProgressBarandroid:id="@+id/progressbar1"style="?android:attr/progressBarStyleHorizontal"android:layout_width="fill_parent"android:layout_height="wrap_content" /><ImageViewandroid:id="@+id/img1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:contentDescription="@id/img1"android:src="@drawable/ic_launcher" /></TableRow><TableRow><Buttonandroid:id="@+id/btn2"android:text="@string/btn2" /><ProgressBarandroid:id="@+id/progressbar2"style="?android:attr/progressBarStyleHorizontal"android:layout_width="fill_parent"android:layout_height="wrap_content" /><ImageViewandroid:id="@+id/img2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:contentDescription="@id/img2"android:src="@drawable/ic_launcher" /></TableRow><TableRow><Buttonandroid:id="@+id/btn3"android:text="@string/btn3" /><ProgressBarandroid:id="@+id/progressbar3"style="?android:attr/progressBarStyleHorizontal"android:layout_width="fill_parent"android:layout_height="wrap_content" /><ImageViewandroid: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-sdkandroid:minSdkVersion="10"android:targetSdkVersion="10" /><!-- 访问网络的权限 --><uses-permission android:name="android.permission.INTERNET" ></uses-permission><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid: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相关内容感兴趣的读者可查看本站专题:《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。