Android 讲解:AsyncTask

AsyncTask是一个类,作用和Hanlder 一样,都是Android 中异步代码执行。相比HanlderAsyncTaskHanlder 代码清晰,容易理解,前提是你已经熟练掌握AsyncTask

这里用一个模拟下载程序来使用AsyncTask 。

代码实例

main_Activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.met0.android.asycntask.MainActivity" >

       <ProgressBar
            android:id="@+id/progressbar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
             />

</RelativeLayout>

这个布局文件比较简单,就是一个进度条,用来显示下载进度。

DownAsyncTask.java

public class DownAsyncTask extends AsyncTask<Void, Integer, Boolean> {

    private ProgressBar progressBar;
    private Context context;

    public  DownAsyncTask(ProgressBar progressBar,Context context) {
        this.progressBar = progressBar;
        this.context = context;
    }

    @Override
    protected void onPreExecute() {

    }


    @Override
    protected Boolean doInBackground(Void... params) {

        int i = 1;
        while(i++ != 50){
            try {
                Thread.sleep(100);
                publishProgress(i * 100 / 50);
            } catch (InterruptedException e) {
                return false;
            }
        }

        return true;
    }


    @Override
    protected void onProgressUpdate(Integer... values) {
        int progress = values[0];
        progressBar.setProgress(progress);
    }


    @Override
    protected void onPostExecute(Boolean result) {
        if(result){
            Toast.makeText(context, "download success!!", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(context, "download fail!!", Toast.LENGTH_LONG).show();
        }
    }



}

下面一点一点解析这个类。

public class DownAsyncTask extends AsyncTask<Void, Integer, Boolean>{}
这个一个继承AsyncTask 的一个类。
有3个泛型
第一个Void, 是其他类启动DownAsyncTask 时传的参数类型。
第二个Integer ,这个一个下载程序,用Integer 代表下载的进度的类型。
第三个Boolean,这个是当执行完成后,返回的结果的类型。

可能以上的几个泛型还不是太理解,下面看看介绍函数的时候就明白了。

private ProgressBar progressBar; 用来显示下载的进度
private Context context; 在这个类中,作用只有一个,就是用来看到最后下载是否成功,用来做Toast 的参数。

public DownAsyncTask(ProgressBar progressBar,Context context)这个构造函数是用来初始化progressBarcontext的。

protected void onPreExecute() 是启动后台任务时执行的方法,主要用于界面的初始化,如加载一个下载进度条(这里我们进度条直接显示,无需加载,所有什么代码也没写)。

doInBackground(Void... params) 后台任务的代码就在这里面编写,这个函数模拟了一个下载程序,当下载一点后,执行publishProgress(Integer... progress) 函数,参数progress 就是下载的进度。这里面不能直接操作UI 控件。

onProgressUpdate(Integer... progress) 用作UI 更新,当doInBackground(Void... params) 函数执行了publishProgress(Integer... progress)函数,则会间接的执行这个函数。

protected void onPostExecute(Boolean result) 当后台任务函数执行完成后,则会返回一个返回值,AsyncTask 会调用这个函数并且把然会在传入进来。

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressbar);

        new DownAsyncTask(progressBar,this).execute();

    }

}

new DownAsyncTask(progressBar,this).execute(); 启动下载后台任务。

运行一下
这里写图片描述 这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值