Android使用AsyncTask实现多线程下载的方法
内容摘要
本文实例讲述了Android使用AsyncTask实现多线程下载的方法。分享给大家供大家参考,具体如下:
public class MainActivity extends Activity implements OnClickListener {
public class MainActivity extends Activity implements OnClickListener {
文章正文
本文实例讲述了Android使用AsyncTask实现多线程下载的方法。分享给大家供大家参考,具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | 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.phpstudy.net/images/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]); // 获取phpstudy的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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?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相关内容感兴趣的读者可查看本站专题:《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
代码注释