android学习笔记——AsyncTask异步消息处理机制简单介绍及使用
来源:互联网 发布:剑桥大学研究生 知乎 编辑:程序博客网 时间:2024/03/29 18:18
1、对于耗时的操作,我们的一般方法是开启“子线程”。如果需要更新UI,则需要使用handler
2、如果耗时的操作太多,那么我们需要开启太多的子线程,这就会给系统带来巨大的负担,随之也会带来性能方面的问题。在这种情况下我们就可以考虑使用类AsyncTask来异步执行任务,不需要子线程和handler,就可以完成异步操作和刷新UI。
3、AsyncTask:对线程间的通讯做了包装,是后台线程和UI线程可以简易通讯:后台线程执行异步任务,将result告知UI线程。
4、使用方法:共分为两步,自定义AsyncTask,在耗时的地方调用自定义的AsyncTask。可以参照以下代码示例。
step1:继承AsyncTask<Params,Progress,Result>
Params:输入参数。对应的是调用自定义的AsyncTask的类中调用excute()方法中传递的参数。如果不需要传递参数,则直接设为Void即可。
Progress:子线程执行的百分比
Result:返回值类型。和doInBackground()方法的返回值类型保持一致。
step2:实现以下几个方法:执行时机和作用看示例代码,以下对返回值类型和参数进行说明
onPreExecute():无返回值类型。不传参数
doInBackground(Params... params):返回值类型和Result保持一致。参数:若无就传递Void;若有,就可用Params
publishProgress(Params... params):在执行此方法的时候会直接调用onProgressUpdate(Params... values)
onProgressUpdate(Params... values):无返回值类型。参数:若无就传递Void;若有,就可用Progress
onPostExecute(Result result) :无返回值类型。参数:和Result保持一致。
step3:在调用自定义的AsyncTask类中生成对象;
执行 :对象.excute(Params... params);
小注:
AsyncTask主要方法的梳理:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello"/>
<Button
android:id="@+id/download"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Download"/>
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="当前进度显示"/>
<ProgressBar
android:id="@+id/pb"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"/>
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class AsyncTaskDemoActivity extends Activity {
/** Called when the activity is first created. */
private Button download;
private TextView tv;
private ProgressBar pb;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout1);
initView();
}
private void initView() {
// TODO Auto-generated method stub
tv=(TextView)findViewById(R.id.tv);
pb=(ProgressBar)findViewById(R.id.pb);
download=(Button)findViewById(R.id.download);
download.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
DownloadTask dt=new DownloadTask(AsyncTaskDemoActivity.this,pb,tv);
dt.execute(100);//参数影响线程的休息时间
}
});
}
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;
public class DownloadAsyncTask extends AsyncTask<Integer, Integer, String> {
//后面尖括号内分别是参数(线程休息时间),进度(publishProgress用到),返回值 类型
private Context mContext=null;
private ProgressBar mProgressBar=null;
private TextView mTextView=null;
public DownloadAsyncTask(Context context, ProgressBar pb, TextView tv){
this.mContext=context;
this.mProgressBar=pb;
this.mTextView=tv;
}
/*
* 第一个执行的方法
* 执行时机:在执行实际的后台操作前,被UI 线程调用
* 作用:可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
* @see android.os.AsyncTask#onPreExecute()
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
Log.d("DownloadAsyncTask", "onPreExecute executed");
super.onPreExecute();
}
/*
* 执行时机:在onPreExecute 方法执行后马上执行,该方法运行在后台线程中
* 作用:主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected String doInBackground(Integer... params) {
// TODO Auto-generated method stub
Log.d("DownloadAsyncTask", "doInBackground executed");
for(int i=0;i<=100;i++){
publishProgress(i);//当前任务进度通过i传入
try {
Thread.sleep(params[0]);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "执行完毕";
}
/*
* 执行时机:这个函数在doInBackground调用publishProgress时被调用后,UI 线程将调用这个方法.虽然此方法只有一个参数,但此参数是一个数组,可以用values[i]来调用
* 作用:在界面上展示任务的进展情况,例如通过一个进度条进行展示。此实例中,该方法会被执行100次
* @see android.os.AsyncTask#onProgressUpdate(Progress[])
*/
@Override
protected void onProgressUpdate(Integer... values) {
int progress = values[0];
// TODO Auto-generated method stub
Log.d("DownloadAsyncTask", "onProgressUpdate executed");
mProgressBar.setProgress(progress);
mTextView.setText(values[0]+"%");
super.onProgressUpdate(values);
}
/*
* 执行时机:在doInBackground 执行完成后,将被UI 线程调用
* 作用:后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户
* result:上面doInBackground执行后的返回值,所以这里是"执行完毕"
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
Log.d("DownloadAsyncTask", "onPostExecute executed");
super.onPostExecute(result);
- android学习笔记——AsyncTask异步消息处理机制简单介绍及使用
- Android笔记----AsyncTask异步消息处理机制
- Android多线程,异步消息处理机制, Thread, AsyncTask 简单总结
- 异步消息处理机制及AsyncTask的使用
- Android异步消息处理机制(3)AsyncTask基本使用
- Android异步消息处理机制学习笔记
- Android AsyncTask异步处理消息机制
- Android异步消息机制和AsyncTask接口的使用 [学习笔记]
- AsyncTask异步消息处理机制
- AsyncTask 异步消息处理机制
- 【Android】安卓学习笔记之多线程、异步消息处理机制、使用AsyncTask在子线程中对UI 进行操作
- Android异步消息处理机制(一):简单使用
- 《第一行代码》自学笔记-Android中异步消息处理机制&&AsyncTask的用法
- 学习笔记:android中Handler异步消息处理机制
- android os;异步消息处理机制:AsyncTask和Handler
- Android异步消息处理机制(4)AsyncTask源码解析
- 安卓开发:AsyncTask异步消息处理机制使用
- Android学习笔记:Android消息处理机制之Handler介绍
- STM32:如何用JLINK ULINK JTAG 查看 KEIL /MDK 某条指令执行时间
- android学习笔记——android多线程编程初探
- The 5th Zhejiang Provincial Collegiate Programming Contest
- Unity+XiaoMiPush 对接小米推送sdk
- Bluemix结合DevOps Service实现一键部署
- android学习笔记——AsyncTask异步消息处理机制简单介绍及使用
- span文字太长显示不下显示...
- 我爱学Java之Map操作详解
- java二分法查找两种实现方法
- 自定义View(二)——文字滚动、动态画圆
- STM32:STM32学习记录1:MDK基本数据类型及代码优化
- CodeForces 630 R. Game【博弈】
- 配置JDK
- android学习笔记——Service服务初探