AsyncTask

一、什么是AsyncTask

AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并主线程中更新UI,通过AsyncTask可以更加方便执行后台任务以及在主线程中访问UI,但是AsyncTask并不适合进行特别耗时的后台任务,对于特别耗时的任务来说,建议使用线程池。

二、如何使用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.一个任务实例只能执行一次,如果执行第二次将会抛出异常。

三、使用AsyncTask做倒计时

package com.example.administrator.handlerdemo;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Main2Activity extends AppCompatActivity {


    private Button daojishiBtn;
    private EditText daojishiET;
    private TextView daojishiTv;

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

        bindID();

        daojishiBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int time = Integer.parseInt(daojishiET.getText().toString());
                new MyTask().execute(time);

            }
        });
    }

    private void bindID() {
        daojishiBtn=findViewById(R.id.daojishi_btn);
        daojishiET=findViewById(R.id.daojishi_et);
        daojishiTv=findViewById(R.id.daojishi_tv);
    }

    class MyTask extends AsyncTask<Integer,Integer,String>{

        @Override
        protected String doInBackground(Integer... integers) {
            for (int i=integers[0];i>0;i--){
                try {
                    Thread.sleep(1000);
                    publishProgress(i);//调用onProgressUpdate方法
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            return "计时结束";
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            daojishiTv.setText(values[0]+"");
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            daojishiTv.setText(s);
        }
    }
}

四、使用AsyncTask做进度条

package com.example.administrator.handlerdemo;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

public class JinduActivity extends AppCompatActivity implements View.OnClickListener{

    private ProgressBar pb1;
    private Button btn1;
    private ProgressBar pb2;
    private Button btn2;

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


        bindID();



    }

    private void bindID() {
        btn1=findViewById(R.id.btn1);
        pb1=findViewById(R.id.pb1);
        btn2=findViewById(R.id.btn2);
        pb2=findViewById(R.id.pb2);

        pb1.setMax(10);
        pb2.setMax(10);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn1:
                btn1.setEnabled(false);
                btn1.setText("正在下载");
                new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);
                break;
            case R.id.btn2:
                btn2.setEnabled(false);
                btn2.setText("正在下载");
                new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);
                break;
        }

    }

    class MyTask extends AsyncTask<Integer,Integer,Integer>{

        @Override
        protected Integer doInBackground(Integer... integers) {
            int whichPb=integers[0];
            for (int i=1;i<=10;i++){
                try {
                    Thread.sleep(1000);
                    publishProgress(i,whichPb);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return whichPb;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            switch (values[1]){
                case 1:
                    pb1.setProgress(values[0]);
                    break;
                case 2:
                    pb2.setProgress(values[0]);
                    break;
            }
        }

        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
            switch (integer){
                case 1:
                    btn1.setText("下载完成");
                    btn1.setEnabled(true);
                    break;
                case 2:
                    btn2.setText("下载完成");
                    btn2.setEnabled(true);
                    break;
            }

        }
    }
}

五、Execute和executeOnExecute有何区别

方法execute: 
用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能 

execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程 或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。

方法executeUpdate 

用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

六、更喜欢AsyncTask还是更喜欢Handler,为什么?

更喜欢AsyncTask

使用的优点: 
1.简单,快捷 
2. 过程可控

AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。

AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)

 AsyncTask定义了三种泛型类型 Params,Progress和Result。






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值