易网时代-编程资源站
Welcome
微信登录
首页
/
操作系统
/
Linux
/
Android异步处理四:AsyncTask的实现原理
在《Android异步处理二:使用AsyncTask异步更新UI界面》一文中,我们介绍了如何使用AsyncTask实现异步下载图片,并且更新图片到UI界面的方法。本篇我们将学习Framework层AsyncTask的实现原理。概述:AsyncTask的本质是一个线程池,所有提交的异步任务都会在这个线程池中的工作线程内执行,当工作线程需要跟UI线程交互时,工作线程会通过向在UI线程创建的Handler(原理见:《Android异步处理三:Handler+Looper+MessageQueue深入详解》)传递消息的方式,调用相关的回调函数,从而实现UI界面的更新。
Android异步处理系列文章索引 http://www.linuxidc.com/Linux/2011-09/43146.htm
Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Looper+MessageQueue深入详解Android异步处理四:AsyncTask的实现原理例子:本章还是以《Android异步处理二:使用AsyncTask异步更新UI界面》中的例子说明AsyncTask的实现原理。这个例子是在后台下载Linux公社的LOGO,下载完成后在UI界面上显示出来。AsyncTask.java
package
com.zhuozhuo;
import
org.apache.http.HttpResponse;
import
org.apache.http.client.HttpClient;
import
org.apache.http.client.methods.HttpGet;
import
org.apache.http.impl.client.DefaultHttpClient;
import
android.app.Activity;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.os.AsyncTask;
import
android.os.Bundle;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.ImageView;
import
android.widget.ProgressBar;
import
android.widget.Toast;
public
class
AsyncTaskActivity
extends
Activity {
private
ImageView mImageView;
private
Button mButton;
private
ProgressBar mProgressBar;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
mImageView= (ImageView) findViewById(R.id.imageView);
mButton = (Button) findViewById(R.id.button);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mButton.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
GetCSDNLogoTask task =
new
GetCSDNLogoTask();
task.execute(
"http://www.linuxidc.com/pic/logo.gif"
);
}
});
}
class
GetCSDNLogoTask
extends
AsyncTask<String,Integer,Bitmap> {
//继承AsyncTask
@Override
protected
Bitmap doInBackground(String... params) {
//处理后台执行的任务,在后台线程执行
publishProgress(
0
);
//将会调用onProgressUpdate(Integer... progress)方法
HttpClient hc =
new
DefaultHttpClient();
publishProgress(
30
);
HttpGet hg =
new
HttpGet(params[
0
]);
//获取csdn的logo
final
Bitmap bm;
try
{
HttpResponse hr = hc.execute(hg);
bm = BitmapFactory.decodeStream(hr.getEntity().getContent());
}
catch
(Exception e) {
return
null
;
}
publishProgress(
100
);
//mImageView.setImageBitmap(result); 不能在后台线程操作ui
return
bm;
}
protected
void
onProgressUpdate(Integer... progress) {
//在调用publishProgress之后被调用,在ui线程执行
mProgressBar.setProgress(progress[
0
]);
//更新进度条的进度
}
protected
void
onPostExecute(Bitmap result) {
//后台任务执行完之后被调用,在ui线程执行
if
(result !=
null
) {
Toast.makeText(AsyncTaskActivity.
this
,
"成功获取图片"
, Toast.LENGTH_LONG).show();
mImageView.setImageBitmap(result);
}
else
{
Toast.makeText(AsyncTaskActivity.
this
,
"获取图片失败"
, Toast.LENGTH_LONG).show();
}
}
protected
void
onPreExecute () {
//在 doInBackground(Params...)之前被调用,在ui线程执行
mImageView.setImageBitmap(
null
);
mProgressBar.setProgress(
0
);
//进度条复位
}
protected
void
onCancelled () {
//在ui线程执行
mProgressBar.setProgress(
0
);
//进度条复位
}
}
}
main.xml
<?xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:orientation
=
"vertical"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
>
<ProgressBar
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:id
=
"@+id/progressBar"
style
=
"?android:attr/progressBarStyleHorizontal"
></ProgressBar>
<Button
android:id
=
"@+id/button"
android:text
=
"下载图片"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
></Button>
<ImageView
android:id
=
"@+id/imageView"
android:layout_height
=
"wrap_content"
android:layout_width
=
"wrap_content"
/>
</LinearLayout>
mainifest.xml
<?xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<manifest
xmlns:android
=
"http://schemas.android.com/apk/res/android"
package
=
"com.zhuozhuo"
android:versionCode
=
"1"
android:versionName
=
"1.0"
>
<uses-sdk
android:minSdkVersion
=
"10"
/>
<uses-permission
android:name
=
"android.permission.INTERNET"
></uses-permission>
<application
android:icon
=
"@drawable/icon"
android:label
=
"@string/app_name"
>
<activity
android:name
=
".AsyncTaskActivity"
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>
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图