本文实例讲述了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;
@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 ]); // 获取jb51的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程序设计有所帮助。