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;        }    }}





0 0
原创粉丝点击