Android使用AsyncTask实现多线程下载的方法
本文实例讲述了Android使用AsyncTask实现多线程下载的方法。分享给大家供大家参考,具体如下:
publicclassMainActivityextendsActivityimplementsOnClickListener{
privateButtonbtn1,btn2,btn3;
privateProgressBarprogressBar1,progressBar2,progressBar3;
privateImageViewimg1,img2,img3;
privatestaticfinalStringIMG_URI="https://www.nhooo.com/images/logo.gif";
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initListener();
}
/**
*初始化监听器
*/
privatevoidinitListener(){
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
}
/**
*
*初始化控件
*/
privatevoidinitView(){
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
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
@Override
publicvoidonClick(Viewarg0){
//点击按钮模拟下载
MyDownloadAsydown=newMyDownloadAsy();
down.execute(IMG_URI,arg0.getId()+"");
}
/**
*1.Params,传递给后台任务的参数类型。
*
*2.Progress,后台计算执行过程中,进步单位(progressunits)的类型。(就是后台程序已经执行了百分之几了。)
*
*3.Result,后台执行返回的结果的类型。
*/
classMyDownloadAsyextendsAsyncTask<String,Integer,Bitmap>{
privatestaticfinalStringTAG="asy";
privateintclickBtn=0;
privatevoidi(Stringobject){
Log.i(TAG,object);
}
@Override
protectedvoidonPreExecute(){
//TODOAuto-generatedmethodstub
super.onPreExecute();
i("準備運行線程");
progressBar1.setProgress(0);//进度条复位
progressBar2.setProgress(0);//进度条复位
progressBar3.setProgress(0);//进度条复位
}
@Override
protectedBitmapdoInBackground(String...arg0){
switch(Integer.parseInt(arg0[1])){
caseR.id.btn1:
clickBtn=1;
break;
caseR.id.btn2:
clickBtn=2;
break;
caseR.id.btn3:
clickBtn=3;
break;
default:
break;
}
i("正在后台执行");
publishProgress(0);
//下载图片
HttpClienthc=newDefaultHttpClient();
//等待2s
sleepWait();
publishProgress(50);
HttpGethg=newHttpGet(arg0[0]);//获取jb51的logo
finalBitmapbm;
try{
HttpResponsehr=hc.execute(hg);
bm=BitmapFactory.decodeStream(hr.getEntity().getContent());
}catch(Exceptione){
returnnull;
}
sleepWait();
publishProgress(100);
//mImageView.setImageBitmap(result);不能在后台线程操作ui
returnbm;
}
/**
*等待2s钟
*/
privatevoidsleepWait(){
try{
Thread.sleep(2000);
}catch(InterruptedExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
}
protectedvoidonProgressUpdate(Integer...values){
//动态更新
i("進度更新");
switch(clickBtn){
case1:
progressBar1.setProgress(values[0]);//更新进度条的进度
break;
case2:
progressBar2.setProgress(values[0]);//更新进度条的进度
break;
case3:
progressBar3.setProgress(values[0]);//更新进度条的进度
break;
default:
break;
}
}
protectedvoidonPostExecute(Bitmapresult){
//TODOAuto-generatedmethodstub
super.onPostExecute(result);
i("线程执行完成");
if(result!=null){
i("下载图片成功");
switch(clickBtn){
case1:
img1.setImageBitmap(result);
break;
case2:
img2.setImageBitmap(result);
break;
case3:
img3.setImageBitmap(result);
break;
default:
break;
}
}else{
i("下载图片失败");
}
}
@Override
protectedvoidonCancelled(){
//TODOAuto-generatedmethodstub
super.onCancelled();
i("取消线程");
switch(clickBtn){
case1:
progressBar1.setProgress(0);//进度条复位
break;
case2:
progressBar2.setProgress(0);//进度条复位
break;
case3:
progressBar3.setProgress(0);//进度条复位
break;
default:
break;
}
}
}
}
xml:
<RelativeLayoutxmlns: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:
<?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns: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-permissionandroid: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> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。