博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 消息异步处理之AsyncTask
阅读量:6406 次
发布时间:2019-06-23

本文共 4709 字,大约阅读时间需要 15 分钟。

Android提供了异步处理消息的方式大致有两种,第一种是,之前已经对于这种方式做过分析,第二种就是AsyncTask,这是Android1.5提供的一种轻量级的工具类,其本质也是对handler和Thread进行了封装适用于一些简单的异步处理。

AsyncTask是一个抽象类,我们需要继承他并实现他的方法,其中有4个方法比较重要,对应着异步处理的几个过程。分别是:

  • onPreExecute()

  • doInBackground(Params... var1)
  • onProgressUpdate(Progress... values)
  • protected void onPostExecute(Result result)

这四个方法的一些参数和返回值都是基于泛型的,而且泛型的类型还不一样,所以在AsyncTask的使用中会遇到三种泛型参数:Params, Progress 和 Result。
  • Params表示用于AsyncTask执行任务的参数的类型
  • Progress表示在后台线程处理的过程中,可以阶段性地发布结果的数据类型
  • Result表示任务全部完成后所返回的数据类型

我们通过调用asynctask的excute()方法就可以执行异步任务,会按照如上的顺序执行,下面依次来介绍一下这几个方法。

onPreExecute()

在执行任务之前在UI线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

doInBackground(Params... var1)

onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数将传递给此步骤。计算结果必须由此步骤返回,并将传递回最后一步。此步骤还可用于publishProgress(Progress...)发布一个或多个进度单位。这些值在onProgressUpdate(Progress...)步骤中发布在UI线程上 。

onProgressUpdate(Progress... values)

在调用后在UI线程上调用publishProgress(Progress...)。执行的时间是不确定的,如果在doInBackground中多次调用了publishProgress方法,那么主线程就会多次回调onProgressUpdate方法。此方法用于在后台计算仍在执行时显示用户界面中的任何形式的进度。例如,它可用于为进度条设置动画或在文本字段中显示日志。

protected void onPostExecute(Result result)

在后台计算完成后在UI线程上调用。doInBackground计算的结果作为参数传递给该步骤。

下面通过一个小demo来实现一下:

 

package com.hxc.supreme.activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.FragmentTransaction;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import com.hxc.supreme.R;import com.hxc.supreme.fragment.QuickControlFragment;import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;/** * created by huxc  on 2017/9/28. * func:asynctask异步下载 * email: hxc242313@qq.com */public class AsyncTaskActivity extends AppCompatActivity implements View.OnClickListener {    private Button btnDownload;    private ImageView ivImage;    private TextView tvProgress;    private final String url = "http://i10.hoopchina.com.cn/hupuapp/bbs/741/36556741/thread_4847_36556741_20180619162627_83601.jpg?x-oss-process=image/resize,w_800/format,jpg";    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_asynctask);        initView();        initListener();        initData();    }    protected void initView() {        btnDownload = (Button) findViewById(R.id.btn_download);        ivImage = (ImageView) findViewById(R.id.iv_image);        tvProgress = (TextView) findViewById(R.id.tv_progress);    }    protected void initListener() {        btnDownload.setOnClickListener(this);    }    protected void initData() {    }    @Override    public void onClick(View view) {        if (view == btnDownload) {            MyAsyncTask asyncTask = new MyAsyncTask();            asyncTask.execute(url);        }    }    class MyAsyncTask extends AsyncTask
{ @Override protected void onPreExecute() { super.onPreExecute(); tvProgress.setText("下载开始"); } @Override protected Bitmap doInBackground(String... strings) { publishProgress("正在下载中..."); return getBitmapFromUrl(strings[0]); } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); tvProgress.setText("正在下载中..."); } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); ivImage.setImageBitmap(bitmap); tvProgress.setText("下载结束"); } } public Bitmap getBitmapFromUrl(String urlString) { Bitmap bitmap; InputStream is = null; try { URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); is = new BufferedInputStream(connection.getInputStream()); bitmap = BitmapFactory.decodeStream(is); connection.disconnect(); return bitmap; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return null; }}

 

布局也很简单就一个button、imageview、TextView

最终的效果图就上我们可爱的刘人语小姐姐吧:

     

 

 

 

转载于:https://www.cnblogs.com/hxchaoshuai/p/9266389.html

你可能感兴趣的文章
功能规格说明书
查看>>
19.浏览器Window服务($window)
查看>>
struts的工作流程
查看>>
RandomStringUtils工具类
查看>>
Struts2---声明式异常处理
查看>>
Django admin 一些有用的设置
查看>>
16、PHP没有Java应用广泛,是不是PHP没有前景了?
查看>>
zip无法解压
查看>>
Python--day47--mysql分页性能相关方案
查看>>
xxx is not in the sudoers file
查看>>
jquery的jsonp用法
查看>>
sublime text 3 左侧目录树中文文件夹显示方框问题解决
查看>>
关于python的单实例模式
查看>>
关于动态加载js
查看>>
iOS多线程编程之GCD介绍(转载)
查看>>
加入公益云计算
查看>>
关于MySQL的wait_timeout连接超时问题报错解决方案
查看>>
有趣的JavaScript小程序
查看>>
Refrain
查看>>
python基础一 ------linux某目录下批量的为特定文件加入可执行权限
查看>>