Android 异步任务AsyncTask的使用

来源:互联网 发布:sendmail php 编辑:程序博客网 时间:2024/04/23 19:53

2017/05/02
时隔几个月,前段时间因为一直被各种事情耽搁,所以一直没有时间去写博客。最近虽然还是很忙,但是觉得还是应该抽出时间来写博客。今天开始,我会争取做到每三天更新一篇博客。希望在csdn的博客中记录我的成长,也希望大家可以从我的博客中学到知识。(如有写错,欢迎指出修正!)

今天这边博客写的是Android异步方面的知识。首先来说一下,异步到底是什么含义:

百度百科

异步:一种通讯方式,对设备需求简单。我们的PC机提供的标准通信接口都是异步的。
异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位。
异步的另外一种含义是计算机多线程的异步处理。与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程。
但此处需要明确的是:异步与多线程与并行不是同一个概念.

上面是百度百科对异步的定义。异步字面意义已经解释的很清楚了,就是不同步的意思。

总所周知,Android的UI只能在主线程中对其进行更新,也就是我们所谓的UI线程。而主线程中是不允许做耗时操作的,根据Android的机制,你在主线程中做耗时操作,它会认定你的APP是处于无响应状态,从而kill了你的APP。所以在对耗时操作,我们应该将其放到异步中去做处理。

这里做一个在异步中更新进度条的小案列。下面县上一个gif图,我知道你们进来都是先找图的,我也是这样的= =。
这里写图片描述

要做异步,首先我们得写一个继承AsyncTask的类,

class Task_1 extends AsyncTask<String, Integer, Integer>

上面三个参数分别代表的意思是:

第一个String代表输入到任务的参数类型,也即是doInBackground()的参数类型
第二个Integer代表处理过程中的参数类型,也就是doInBackground()执行过程中的产出参数类型,通过publishProgress()发消息传递给onProgressUpdate()一般用来更新界面
第三个Integer代表任务结束的产出类型,也就是doInBackground()的返回值类型,和onPostExecute()的参数类型

继承于AsyncTask,首先会让我必须去实现一个方法

@Overrideprotected Integer doInBackground(String... params) {    return null;}

这个方法也是异步里面最核心的一个方法,doInBackground方法是在异步里面的,所以我们把耗时操作都放在这个方法中去进行。最终return一个null或我们需要的数据,传入onPostExecute方法中去做处理。

我们实现第二个方法:

@Overrideprotected void onPostExecute(Integer result) {    // TODO Auto-generated method stub    super.onPostExecute(result);}

onPostExecute方法是当doInBackground执行完毕之后才会执行的,一般我们在这边接收耗时操作处理完后返回过来的一个结果。doInBackground中的return的值将会传入onPostExecute中,在这边也就是result。这个方法是在主线程中执行的,所以我们可以在这个方法中对其更新UI界面。

AsyncTask中的第三个方法

@Overrideprotected void onProgressUpdate(Integer... values) {    super.onProgressUpdate(values);}

onProgressUpdate方法一般是用来更新进度的,让用户可以知道这个耗时操作的更新情况,带来更好的体验。这个方法中可以直接去更新UI视图。

至于如何开启一个异步的执行,Android里面给了我们一个方法,

execute(Params… params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行

我们可以通过实例化异步的类,然后直接.execute()即可开启这个异步任务。
切记,.execute()方法只可以在主线程中去调用!!!

异步的基本使用大致就是这些,下面吧刚刚demo的代码贴一下:

Async.java

public class Async extends Activity{private Button btn_1;private ProgressBar pro_1;@Overrideprotected void onCreate(Bundle savedInstanceState) {    // TODO Auto-generated method stub    super.onCreate(savedInstanceState);    requestWindowFeature(Window.FEATURE_NO_TITLE);    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);    setContentView(R.layout.async);    btn_1 = (Button) findViewById(R.id.btn_1);    pro_1 = (ProgressBar) findViewById(R.id.pro_1);    pro_1.setMax(100);    btn_1.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Task_1 t = new Task_1();            t.execute();            Toast.makeText(Async.this , "开始执行进度条" , Toast.LENGTH_SHORT).show();        }    });}class Task_1 extends AsyncTask<String, Integer, Integer>{    Integer b = 0;    @Override    protected Integer doInBackground(String... params) {        while(b <= 100){            try {                Thread.sleep(100);                publishProgress(b);                b++;            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        return null;    }    @Override    protected void onPostExecute(Integer result) {        // TODO Auto-generated method stub        super.onPostExecute(result);    }    @Override    protected void onProgressUpdate(Integer... values) {        pro_1.setProgress(values[0]);        super.onProgressUpdate(values);    }}

async.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:paddingTop="100dp">    <Button        android:id="@+id/btn_1"        android:layout_width="match_parent"        android:layout_height="40dp"        android:text="开始第一个进度条"        android:background="@drawable/button"        android:layout_margin="10dp"        android:textColor="#fff"        android:textSize="22sp"        />    <ProgressBar        android:id="@+id/pro_1"        android:layout_marginTop="50dp"        style="?android:attr/progressBarStyleHorizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:padding="15dp" /></LinearLayout>

button.xml

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" >    <corners android:radius="10dp" />    <solid android:color="#00f"/></shape>

整个异步的小demo到这里就结束了,有问题欢迎大家留言~~~

2 0
原创粉丝点击