AsyncTask异步任务
来源:互联网 发布:excel提取单元格数据 编辑:程序博客网 时间:2024/06/12 00:17
android中实现异步机制的方法有两种,Handler和AsyncTask。
Handler在使用时,需要新开辟一个线程,在任务完成以后,通过sendmessage()等方法通知UI线程进行界面更新。
相比起Handler,AsyncTask显得更加简单。
我们通常是继承AsyncTask并重写其中的方法:
private class MyTask extends AsyncTask<String, Integer, String> {
三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。并不是所有情况都会使用这些泛型,例如今天。
相关方法和执行过程:
继承AsyncTask,必须重写doInBackground()方法;
1.在UI线程中实例化Task。
2.调用execute()执行一个异步任务
3.onPreExecute()方法在execute()被调用后立即执行,一般用来在执行后台任务前的准备工作。
4.执行doInBackground()方法,用于执行耗时操作。
5.onPostExecute()在doInBackground()方法执行完毕后执行。此方法会被UI线程调用,把计算后的结果展示到UI界面上。
6.调用publishProgress()方法用于更新进度信息。调用此方法后,会调用onProgressUpdate(),onProgressUpdate()会被UI线程调用,把进度信息展示到UI界面上。
7.onCancelled()方法用于取消线程操作。
在使用AsyncTask时要注意以下事项:
1.任务实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
下面写一个例子以免以后忘记:
Xml布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main7" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.quaie.wms.myapplication.Main7Activity"> <!-- 轻量异步类AsyncTask --> <TextView android:id="@+id/asy_text" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center_vertical" android:paddingLeft="10dp" android:text="..." android:textSize="18sp" /> <ProgressBar android:id="@+id/asy_probar" style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="40dp" /> <Button android:id="@+id/asy_btn" android:layout_width="200dp" android:layout_height="50dp" android:layout_gravity="center" android:text="Click Me" /> <Button android:id="@+id/asy_cancel" android:layout_width="200dp" android:layout_height="50dp" android:layout_gravity="center" android:text="cancel" /></LinearLayout>
MyAsyncTask:
public class MyAsyncTask extends AsyncTask { private TextView tv; private ProgressBar pro; public MyAsyncTask(TextView tv, ProgressBar pro) { super(); this.tv = tv; this.pro = pro; } //将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。 //这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。 @Override protected Object doInBackground(Object[] params) { Log.d("MyAsyncTask", "doInBackground"); doDelayOperator delayOperator = new doDelayOperator(); int i; for (i = 0; i < 16; i++) { delayOperator.delay(); //调用onProgressUpdate publishProgress(i); } return null; } //该方法将在执行实际的后台操作前被UI thread调用 //可以在该方法中做一些准备工作 @Override protected void onPreExecute() { Log.d("MyAsyncTask", "onPreExecute"); tv.setText("loading..."); } //在publishProgress方法被调用后,UI线程将调用这个方法从而在界面上展示任务的进展情况 @Override protected void onProgressUpdate(Object[] values) { Log.d("MyAsyncTask", "onProgressUpdate"); pro.incrementProgressBy((Integer) values[0]); tv.setText(pro.getProgress() + "%"); } //当doInBackground运行完成后,调用该方法 @Override protected void onPostExecute(Object o) { Log.d("MyAsyncTask", "onPostExecute"); tv.setText("over"); } //延时操作,用来模拟下载 public class doDelayOperator { public void delay() { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override protected void onCancelled() { Log.d("MyAsyncTask", "onCancelled"); pro.incrementProgressBy(0); }}
activity:
//AsyncTask异步任务public class Main7Activity extends AppCompatActivity implements View.OnClickListener { private TextView asy_text; private ProgressBar asy_probar; private Button asy_btn; private Button asy_cancel; private MyAsyncTask myAsyncTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main7); initView(); } private void initView() { asy_text = (TextView) findViewById(R.id.asy_text); asy_probar = (ProgressBar) findViewById(R.id.asy_probar); asy_btn = (Button) findViewById(R.id.asy_btn); asy_cancel = (Button) findViewById(R.id.asy_cancel); asy_btn.setOnClickListener(this); asy_cancel.setOnClickListener(this); myAsyncTask = new MyAsyncTask(asy_text, asy_probar); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.asy_btn: myAsyncTask.execute(1000); break; case R.id.asy_cancel: myAsyncTask.cancel(true); break; } }}
- Android异步任务AsyncTask
- AsyncTask异步任务
- 异步任务AsyncTask
- AsyncTask异步任务
- AsyncTask异步任务
- Android--AsyncTask异步任务
- Android AsyncTask异步任务
- 异步任务(AsyncTask)
- Android 异步任务 AsyncTask
- 异步任务(AsyncTask)
- android 异步任务 AsyncTask
- Android AsyncTask 异步任务
- Android AsyncTask异步任务
- AsyncTask异步任务
- AsyncTask异步任务
- AsyncTask异步任务
- 异步任务AsyncTask
- 异步任务AsyncTask
- Git打标签tag
- struts2值栈分析
- (斯坦福机器学习笔记)支持向量机
- 【video】流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
- 咖啡知识大全
- AsyncTask异步任务
- opencv学习之直方图绘制
- nginx监听相同端口,根据域名请求不同的server
- 微信小程序上手篇(1)
- 机器学习笔记(四)决策树
- Unity动态字体文字破碎的解决方法(Dynamic Font Broken)
- 蓝桥杯B组C语言-三羊献瑞
- PAT B1004. 成绩排名 (20)
- nodeJs链接Mysql,做增删改查