AsyncTask
AsyncTask也叫做“异步任务”,是一个抽象类
AsyncTask约定了在子线程中执行任务的抽象方法,开发者可以在自定义AsyncTask的实现类中重写该方法,
则AsyncTask在工作时会自动开启子线程执行相关代码
AsyncTask类的声明:
public abstract class AsyncTask<Param,Progress,Result>
Param 执行异步任务后,需要参数的数据类型
Progress 执行异步任务过程中,标识进度的数据类型
Result 执行异步任务后,需要返回的结果的数据类型
AsyncTask中的抽象方法: public abstract Result doInBackground(params... params)
让AsyncTask开始工作:
public final AsyncTask<params,Progress,Result> execute(params...params)
该方法被调用后,会自动开启子线程并调用dnInBackground()方法,该方法
必须在UI线程中调用
案例:
MainActivity:
AsyncTask更新UI
AsyncTask约定了任务执行完毕后的回调方法,该方法并不是抽象的,开发者可以选择性的实现。
protected void onPostExecute(Result result)
该方法是运行在主线程的方法
实例:
布局:
MainActivity:
AsyncTask更新进度
AsyncTask约定了任务执行过程中,更新进度的回调方法,该方法并不是抽象的,开发者可以选择性地实现。
protected void onProgressUpdate(Progress... values)(该方法运行在主线程)
在任务执行过程中,可以调用publishProgress()方法提交进度,使得onProgressUpdate()方法被回调
实例
布局:
LoadImage:
MainActivity:
AsyncTask是一个综合了任务的执行、进度更新、结果提交的类,使用AsyncTask
可以集中的编写某个异步任务的全部代码,而不必关心线程间的通信问题,降低了
编码出错几率,并有效的提高了代码的可阅读性、可维护性等。
小案例之异步加载图片
使用到的技术: Canvas(画布)、Paint(画笔)
Canvas(画布):用来决定画布的基础属性,执行绘制
Paint(画笔):设置颜色、设置字体、其他的设置
同一次绘图过程中,可能需要多个画笔对象,或多次调整画笔的属性
使用Canvas:
public Canvas()
public Canvas(Bitmap bitmap)
public void drawRect(float left,float top,float right,float bottom,Paint paint)
public void drawBitmap(Bitmap bitmap,float left,float top,Paint paint)
public void drawText(String text,float x,float y,Paint paint)
使用Paint:
public Paint()
public native void setColr(int color)
public native void setAntiAlias(boolean aa)
public native void setTextSize(float textSize)
public void setTextAlign(Align align)
public Xfermode setXfermode(Xfermode xfermode)
AsyncTask约定了在子线程中执行任务的抽象方法,开发者可以在自定义AsyncTask的实现类中重写该方法,
则AsyncTask在工作时会自动开启子线程执行相关代码
AsyncTask类的声明:
public abstract class AsyncTask<Param,Progress,Result>
Param 执行异步任务后,需要参数的数据类型
Progress 执行异步任务过程中,标识进度的数据类型
Result 执行异步任务后,需要返回的结果的数据类型
AsyncTask中的抽象方法: public abstract Result doInBackground(params... params)
让AsyncTask开始工作:
public final AsyncTask<params,Progress,Result> execute(params...params)
该方法被调用后,会自动开启子线程并调用dnInBackground()方法,该方法
必须在UI线程中调用
案例:
布局:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="104dp"
android:onClick="doAsyncTask"
android:text="开始" />
MainActivity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("onCreate" + Thread.currentThread().getId());
}
public void doAsyncTask(View view){
new InnerAsyncTask().execute("");
}
private class InnerAsyncTask extends AsyncTask<Object, Object, Object>{
@Override
protected Object doInBackground(Object... params) {
for(int i = 0; i < 30;i++){
System.out.println("InnerAsyncTask" + Thread.currentThread().getId());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
}
}
AsyncTask更新UI
AsyncTask约定了任务执行完毕后的回调方法,该方法并不是抽象的,开发者可以选择性的实现。
protected void onPostExecute(Result result)
该方法是运行在主线程的方法
实例:
布局:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="104dp"
android:onClick="doAsyncTask"
android:text="开始" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button1"
android:layout_centerHorizontal="true"
android:layout_marginTop="22dp"
android:src="@drawable/abs" />
MainActivity:
public class MainActivity extends Activity {
private ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.imageView1);
// System.out.println("onCreate" + Thread.currentThread().getId());
}
public void doAsyncTask(View view){
new InnerAsyncTask().execute("");
}
private class InnerAsyncTask extends AsyncTask<String,Integer, Bitmap>{
@Override
protected Bitmap doInBackground(String... params) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return BitmapFactory.decodeResource(getResources(), R.drawable.abc);
}
@Override
protected void onPostExecute(Bitmap result) {
image.setImageBitmap(result);
}
}
}
AsyncTask更新进度
AsyncTask约定了任务执行过程中,更新进度的回调方法,该方法并不是抽象的,开发者可以选择性地实现。
protected void onProgressUpdate(Progress... values)(该方法运行在主线程)
在任务执行过程中,可以调用publishProgress()方法提交进度,使得onProgressUpdate()方法被回调
实例
布局:
<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" >
<TextView
android:id="@+id/tv_pb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="100%"
android:visibility="gone"
android:textSize="16sp"/>
<Button
android:id="@+id/btn_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="104dp"
android:onClick="doAsyncTask"
android:text="开始" />
<ImageView
android:id="@+id/iv_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_update"
android:layout_centerHorizontal="true"
android:layout_marginTop="22dp"
android:src="@drawable/abs" />
<ProgressBar
android:id="@+id/pb_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:max="100"
android:visibility="gone"
android:layout_alignRight="@+id/btn_update"
android:layout_marginTop="32dp" />
</RelativeLayout>
LoadImage:
public class LoadImage extends AsyncTask<String, Integer, Object> {
private Context context;
private ImageView imageview;
private Bitmap image;
private Button button;
private ProgressBar pg;
private TextView tv;
public LoadImage(Context context, Button button, ImageView imageview,
ProgressBar pg, TextView tv) {
this.context = context;
this.imageview = imageview;
this.button = button;
this.pg = pg;
this.tv = tv;
}
@Override
protected Object doInBackground(String... params) {
for (int i = 0; i <= 100; i++) {
publishProgress(i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
image = BitmapFactory.decodeResource(context.getResources(),
R.drawable.abc);
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
pg.setProgress(values[0]);
tv.setText(values[0] + "%");
}
@Override
protected void onPostExecute(Object result) {
imageview.setImageBitmap(image);
button.setEnabled(true);
pg.setVisibility(View.GONE);
tv.setVisibility(View.GONE);
}
}
MainActivity:
public class MainActivity extends Activity {
private ImageView image;
private Button button;
private ProgressBar pg;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.iv_image);
button = (Button) findViewById(R.id.btn_update);
pg = (ProgressBar) findViewById(R.id.pb_progress);
tv = (TextView) findViewById(R.id.tv_pb);
}
public void doAsyncTask(View view){
button.setEnabled(false);
pg.setVisibility(View.VISIBLE);
tv.setVisibility(View.VISIBLE);
new LoadImage(this,button,image,pg,tv).execute("");
}
}
AsyncTask是一个综合了任务的执行、进度更新、结果提交的类,使用AsyncTask
可以集中的编写某个异步任务的全部代码,而不必关心线程间的通信问题,降低了
编码出错几率,并有效的提高了代码的可阅读性、可维护性等。
小案例之异步加载图片
使用到的技术: Canvas(画布)、Paint(画笔)
Canvas(画布):用来决定画布的基础属性,执行绘制
Paint(画笔):设置颜色、设置字体、其他的设置
同一次绘图过程中,可能需要多个画笔对象,或多次调整画笔的属性
使用Canvas:
public Canvas()
public Canvas(Bitmap bitmap)
public void drawRect(float left,float top,float right,float bottom,Paint paint)
public void drawBitmap(Bitmap bitmap,float left,float top,Paint paint)
public void drawText(String text,float x,float y,Paint paint)
使用Paint:
public Paint()
public native void setColr(int color)
public native void setAntiAlias(boolean aa)
public native void setTextSize(float textSize)
public void setTextAlign(Align align)
public Xfermode setXfermode(Xfermode xfermode)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理