Android 异步任务AsyncTask的使用

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,首先会让我必须去实现一个方法

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

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

我们实现第二个方法:

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

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

AsyncTask中的第三个方法

@Override
protected 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;

@Override
protected 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值