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程序设计有所帮助。