• Android - AsyncTask


    一、概念

            是一个抽象泛型类,由 Android 封装的一个轻量级异步类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。

            内部封装了两个线程池(SerialExecutor、THREAD_POOL_EXECUTOR)和一个Handle(InternalHandler)。SerialExecutor 用于任务的排队,让需要执行的多个耗时任务按顺序排列。THREAD_POOL_EXECUTOR 才真正的执行任务。InternalHandler 用于从子线程切换到主线程。

    二、使用

    public abstract class AsyncTask

    //Parmas:对应 doInBackground() 中的参数类型,即任务开始时,传入的参数类型。

    //Progress:对应 onProgressUpdate() 中的参数类型,即任务执行中,返回下载进度值的类型。

    //Result:对应 onPostExecute() 中的参数类型,即任务执行完,返回的结果类型。

    //如果三个方法确定不需要传递具体参数,那么这三个泛型参数可以用 Void 代替。

    onPreExecute( )任务执行前调用,在主线程执行(用于界面初始化操作如弹出进度条对话框等)。
    doInBackground( )执行耗时任务,在子线程执行。调用 publishProgress( ) 设置进度,调用 return 返回结果。
    onProgressUpdate( )用于更新进度,在主线程执行。
    onPostExecute( )用于获取结果,在主线程执行。
    onCancelled( )任务取消时调用,在主线程执行。并不是真正取消任务只是设置为取消状态,类似于终止一个线程调用 interrupt() 只是标记中断。
    1. mTask = new MyTask(); //注意每次需new一个实例,一个AsyncTask任务只能被执行一次,否则会出现异常
    2. mTask.execute("http://www.baidu.com","www.qq.com","www.taobao.com");
    3. mTask.cancel(true); //取消一个正在执行的任务,onCancelled方法将会被调用
    1. private class MyTask extends AsyncTask{
    2. //任务执行前
    3. protected void onPreExecute() {
    4. textView.setText("loading...");
    5. }
    6. //执行任务
    7. protected String doInBackground(String... params) {
    8. try {
    9. HttpClient client = new DefaultHttpClient();
    10. HttpGet get = new HttpGet(params[0]);
    11. HttpResponse response = client.execute(get);
    12. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    13. HttpEntity entity = response.getEntity();
    14. InputStream is = entity.getContent();
    15. long total = entity.getContentLength();
    16. ByteArrayOutputStream baos = new ByteArrayOutputStream();
    17. byte[] buf = new byte[1024];
    18. int count = 0;
    19. int length = -1;
    20. while ((length = is.read(buf)) != -1) {
    21. baos.write(buf, 0, length);
    22. count += length;
    23. //设置进度
    24. publishProgress((int) ((count / (float) total) * 100));
    25. Thread.sleep(500); //为了演示进度,休眠500毫秒
    26. }
    27. return new String(baos.toByteArray(), "gb2312");
    28. }
    29. } catch (Exception e) {
    30. Log.e(TAG, e.getMessage());
    31. }
    32. return null;
    33. }
    34. //更新进度
    35. protected void onProgressUpdate(Integer... progresses) {
    36. progressBar.setProgress(progresses[0]);
    37. textView.setText("loading..." + progresses[0] + "%");
    38. }
    39. //获取结果
    40. protected void onPostExecute(String result) {
    41. textView.setText(result);
    42. execute.setEnabled(true);
    43. cancel.setEnabled(false);
    44. }
    45. //任务取消时
    46. protected void onCancelled() {
    47. textView.setText("cancelled");
    48. progressBar.setProgress(0);
    49. execute.setEnabled(true);
    50. cancel.setEnabled(false);
    51. }
    52. }

  • 相关阅读:
    目标检测算法改进系列之Backbone替换为RepViT
    陈芳允于1971年提出双星定位
    1536. 排布二进制网格的最少交换次数;754. 到达终点数字;1106. 解析布尔表达式
    python如何将一个dataframe快速写入clickhouse
    职业PDF标准 Python 下载器-CSDN
    每天5分钟复习OpenStack(八)存储虚拟化
    A股风格因子看板 (2023.09 第07期)
    只分享这一次。阿里软件架构师深入底层手写JDK源码
    基于Pyflwdir实现流域的提取(参照官网例子)
    力扣算法题——828.统计子串中的唯一字符
  • 原文地址:https://blog.csdn.net/HugMua/article/details/133758777