精华内容
参与话题
问答
  • AsyncTask

    千次阅读 2018-03-11 15:51:51
    AsyncTask 1.什么是AsyncTask 1.AsyncTask是Android提供的轻量级( 实现代码量少) 的异步类。 2.为了降低异步通信的开发难度,提供了AsyncTask。 3.AsyncTask直接继承于0bject类,位于android.os包中。 4.使用...

    AsyncTask

    1.什么是AsyncTask

    1.AsyncTask是Android提供的轻量级( 实现代码量少) 的异步类。
    2.为了降低异步通信的开发难度,提供了AsyncTask。
    3.AsyncTask直接继承于0bject类,位于android.os包中。
    4.使用AsyncTask可以忽略Looper、MessageQueue、Handler
    等复杂对象,更便捷的完成异步耗时操作。
    这里写图片描述

    2.为什么要学习AsyncTask

    1.Android中实现消息通信,需要掌握主线程的刷新机制,Thread,Looper,MessageQueue.Handler.
    Message等知识。
    2.当执行一个较为简单的耗时操作时(如:倒计时,下载等),AndroidSDK提供了一种轻量级的消息通信方法-AsyncTask。
    3.只需掌握几个方法即可完成消息通信,降低了消息通信难度。

    如何使用AsyncTask

    1.新建内部类继承AsyncTask 。
    2.定义Asyn cTask的三种泛型参数。
    3.重写dolnBackground抽象方法。
    4.重写onPreExecute方法。
    5.重写onProgressUpdate方法。
    6.重写onPostExecute方法。
    7.在需要启动的地方调用execute方法。

    AsyncTask的泛型参数

    Params: 启动任务执行的输入参数。
    Progress: 后台任务执行的百分比。
    Result: 后台执行任务最终返回的结果。

    AsyncTask常用方法
    onPreExecute方法:

    1.异步任务开始执行时,系统最先调用此方法。
    2.此方法运行在主线程中,可以对控件进行初始化等操作。

    dolnBackground方法:

    1.执行完onPreExecute方法后,系统执行此方法
    2.此方法运行在子线程中,比较耗时的操作放在此方法中执行。

    onProgressUpdate方法:

    1.显示当前进度,适用于下载或扫描这类需要实时显示进度的需求。
    2.此方法运行在主线程中,可以修改控件状态,例如: 显示百分比。
    3.触发此方法,需要在dolnBackground中使用publishProgress方法。

    publishProgress方法:

    1.在doInBackground中使用。
    2.用于触发onProgressUpdate方法。

    on PostExecute方法:

    1.当异步任务执行完成后,系统会调用此方法。
    2.此方法运行在主线程中,可以修改控件状态,例如: 下载完成。

    实例演示

    使用AsyncTask做倒计时
    <?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">
    
        <EditText
            android:id="@+id/et"
            android:layout_width="match_parent"
            android:layout_height="50dp" />
        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="倒计时"
            android:textSize="30sp"
            android:layout_gravity="center"
            />
        <Button
            android:id="@+id/bt"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:text="开始倒计时"
            android:textSize="20sp"/>
    
    </LinearLayout>
    package com.example.pc.asynctask;
    
    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 AsyncTaskActivity extends AppCompatActivity {
    
        private EditText et;
        private TextView tv;
        private Button bt;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_async_task);
    
            bindID();
    
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int time = Integer.parseInt(et.getText().toString());
                    new MyTask().execute(time);
                }
            });
    
        }
    
        private void bindID() {
    
            et = findViewById(R.id.et);
            tv = findViewById(R.id.tv);
            bt = findViewById(R.id.bt);
        }
    
        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);
                tv.setText(values[0]+"");
            }
    
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                tv.setText(s);
            }
        }
    }
    

    这里写图片描述

    使用AsyncTask做进度条
    <?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:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <ProgressBar
            android:id="@+id/pr1"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="50dp" />
        //进度条
        <ProgressBar
            android:id="@+id/pr2"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="50dp" />
        <Button
            android:id="@+id/bt1"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:text="点击下载"
            android:textSize="50sp" />
        <Button
            android:id="@+id/bt2"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:text="点击下载"
            android:textSize="50sp" />
    
    </LinearLayout>
    package com.example.pc.asynctask;
    
    import android.os.AsyncTask;
    import android.support.annotation.IntegerRes;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ProgressBar;
    
    public class jindutiaoActivity extends AppCompatActivity implements View.OnClickListener{
    
        private Button btn1;
        private Button btn2;
        private ProgressBar pro1;
        private ProgressBar pro2;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_jindutiao);
            bindID();
        }
    
        private void bindID() {
            btn1=findViewById(R.id.bt1);
            btn2=findViewById(R.id.bt2);
            pro1=findViewById(R.id.pr1);
            pro2=findViewById(R.id.pr2);
            btn1.setOnClickListener(this);
            btn2.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.bt1:
                    DownloadTask d1=new DownloadTask();
                    d1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);
                    btn1.setText("正在下载");
                    btn1.setEnabled(false);
                    break;
                case R.id.bt2:
                    DownloadTask d2=new DownloadTask();
                    d2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);
                    btn2.setText("正在下载");
                    btn2.setEnabled(false);
                    break;
                default:
                    break;
            }
        }
    
        class DownloadTask extends AsyncTask<Integer,Integer,String>{
    
            @Override
            protected String doInBackground(Integer... integers) {
                System.out.println(integers[0]+"...启动");
                String result=integers[0]+"";//将int类型转换成字符串
                for (int i=0;i<=10;i++){
                    try {
                        Thread.sleep(1000);
                        publishProgress(i,integers[0]);//更新进度跳到onProgressUpdate()
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                return result;
            }
    
            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                int flag=values[1];//新建int类型接收用switch来判断是1还是2
                switch (flag){
                    case 1:
                        pro1.setProgress(values[0]*10);
                        break;
                    case 2:
                        pro2.setProgress(values[0]*10);
                        break;
                    default:
                        break;
                }
    
            }
    
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                System.out.println(s+"");
                int flag= Integer.parseInt(s);
                switch (flag){
                    case 1:
                        btn1.setText("下载完成");
                        btn1.setEnabled(true);//完成时按键变为不可按
                        break;
                    case 2:
                        btn2.setText("下载完成");
                        btn2.setEnabled(true);
                        break;
                    default:
                        break;
                }
    
            }
        }
    
    }

    这里写图片描述

    Execute()和executeOnExecuter()有何区别

    执行execute()方法线程可以只能串行运行
    使用execute()方法启动的进度条一个结束后才能启动另一个进度条
    执行executeOnExecuter()方法线程并行运行,不过同一时间只能启动五个线程
    使用executeOnExecuter()启动的进度条同时下载

    喜欢AsyncTask还是喜欢handler

    AsyncTask使用的优点是简单,快捷,过程可控。使用的缺点是在使用多个异步操作和并需要进行UI变更时,就会变得复杂起来。
    Handler使用的优点是结构清晰,功能定义明确,对于多个后台任务时,简单,清晰。使用的缺点是在单个后台异步处理时,显得代码过多,结构过于复杂。
    所以在数据简单时使用AsyncTask,数据量多且复杂就使用handler。
    
    展开全文

空空如也

1 2 3 4 5 ... 20
收藏数 13,794
精华内容 5,517
热门标签
关键字:

asynctask