异步任务AsyncTask

什么是异步任务?

逻辑上:以多线程的方式完成的功能需求

API上:指AsyncTask类

AsyncTask的理解

在没有AsyncTask之前,我们用Handler+Thread就可以实现异步任务的功能需求

AsyncTask是对Handler和Thread的封装,使用它更编码更简洁,更高效

AsyncTask封装了ThreadPool,比直接使用Thread效率要高

API

AsyncTask

    简化Handler处理多线程通信的问题

AsyncTask<Params,Progress,Result>

Params启动任务执行的输入参数,比如HTTP请求的URL。

Progress后台任务执行的百分比。

Result后台执行任务最终返回的结果,比如String。

execute(Params...params)

启动任务,开始任务的执行流程

void onPreExecute()

在分线程工作开始之前在UIThread中执行,一般用来显示提示视图

Result dolnBackground(Params..…params)

在workerThread中执行,完成任务的主要工作,通常需要较长的时间

void onPostExecute(Result result)

在dolnBackground()执行完后在UIThread中执行,一般用来更新界面

publishProgress(Progress...values)

    在分线程中,发布当前进度

void oriProgressUpdate(Progress...values)

    在主线程中更新进度

执行流程

代码实例
activity实例

package xlr.com.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.ProgressBar;
import android.widget.TextView;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;


public class MainActivity extends AppCompatActivity {
    MainActivity.MyTask myTask;
    // 主布局中的UI组件
    Button button; // 加载、取消按钮
    public TextView text; // 更新的UI组件
    ProgressBar progressBar; // 进度条

    //异步处理
    public class MyTask extends AsyncTask<String, Integer, String> {
        //处理流程
        
        @Override
        protected void onPreExecute() {
            。。。。。。。
        }
        
         @Override
        protected String doInBackground(String... strings) {
         	publishProgress(Parm。。。。parm);
            。。。。。。。
        }
        
        @Override
        protected void onProgressUpdate(Integer... values) {
            。。。。。。。
        }
        
         @Override
        protected void onPostExecute(String s) {
            。。。。。。。
        }
        
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取布局元素
        button = (Button) findViewById(R.id.button);
        text = (TextView) findViewById(R.id.text);
        progressBar = (ProgressBar) findViewById(R.id.progress_bar);
        //创建静态内部类
        myTask = new MainActivity.MyTask();
        //通过点击开启异步处理
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //开启处理方法
                myTask.execute();
            }
        });
    }
}

MyTask实例(以获取页面源码为例)

//异步处理
public class MyTask extends AsyncTask<String, Integer, String> {
    String resut;
    //用于界面初始化
    @Override
    protected void onPreExecute() {
        text.setText("loading...");
    }
    //执行任务
    @Override
    protected String doInBackground(String... strings) {
        try {
            //1). 得到path, 并带上参数name=Tom1&age=11
            String path = "http://192.168.152.2/";
            //2). 创建URL对象
            URL url = new URL(path);
            //3). 打开连接, 得到HttpURLConnection对象]
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            //4). 设置请求方式,连接超时, 读取数据超时
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setConnectTimeout(5000);
            httpURLConnection.setReadTimeout(6000);
            //5). 连接服务器
            httpURLConnection.connect();
            //6). 发请求, 得到响应数据
            //得到响应码, 必须是200才读取
            int code = httpURLConnection.getResponseCode();
            if (code == 200) {
                InputStream in = httpURLConnection.getInputStream();
                //得到InputStream, 并读取成String
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                byte[] buffer = new byte[12];
                int len = -1;
                while ((len = in.read(buffer)) != -1) {
                    byteArrayOutputStream.write(buffer, 0, len);
                    // 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()
                    publishProgress(len);
                    // 模拟耗时任务
                    Thread.sleep(50);
                }
                resut = byteArrayOutputStream.toString();
                System.out.println(resut);
                byteArrayOutputStream.close();
                in.close();
            }
            httpURLConnection.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    //在主线程显示线程任务执行的进度
    @Override
    protected void onProgressUpdate(Integer... values) {
        progressBar.setProgress(values[0]);
        text.setText("loading..." + values[0] + "%");
    }
    //线程结束后更新界面组件
    @Override
    protected void onPostExecute(String s) {
        // 执行完毕后,则更新UI
       text.setText(resut);
       button.setVisibility(View.VISIBLE);
       button.setClickable(false);
    }
}
posted @ 2019-05-19 21:45  Kill(Bug)  阅读(78)  评论(0)    收藏  举报