android中,为了避免UI线程阻塞,失去响应的问题,建议将耗时的操作放在新的线程中执行,但是,在新的线程中不允许直接更新UI,那么我们该如何解决呢?比如这样一个实例:我需要执行一个耗时的操作A,在A结束后才刷新当前页面UI,但又不希望用户感觉到这个等待的时间存在,这时,我们该如何解决呢?

android中,提供了几种方案:

1,使用Handler实现线程通信;

2,使用AsyncTask

3Activity.runOnUiThread(Runnable);

4View.post(Runnable);

对于Handler,大家可能并不陌生,而AsyncTask相比Handler而言,更轻量级一些,不需要借助HandlerThread即可实现UI刷新;对于34两种方法,比较繁琐,因此,这里主要介绍一下异步操作。

网上关于异步操作AsyncTask刷新UI的例子太少,而且前篇一律的都是网络资源下载的一个例子,今天,我们介绍一个新的例子,就针对开始的那个耗时操作的问题来说吧。

首先,我要实现一个HorizontalScrollView加载多个ImageView显示图像的功能,而图像的加载需要执行耗时操作,比如对每个图像都进行一些图像处理变换等,然后加载到HorizontalScrollView中显示,假如我直接在主线程中进行,那么用户可能会有个图像刷新等待时间,假如每张图像处理100ms,那么20张图像就2s了,等到20张图像一起处理完了再更新UI,这个时间会严重影响用户体验效果,因此,我把这个图像处理刷新,放在一个异步任务中执行,这样,20张图像是一次刷新出来,用户体验上是很快的连续刷出来的20张图像,每次刷新时间间隔是100ms,效果明显不一样了。

下面我们就构建这样一个异步类:

class ThumbnailGenerateTask extends AsyncTask<Integer, Integer, Bitmap> {        private ImageView imageView;          private int id = 0;//imageView的索引          public ThumbnailGenerateTask(ImageView imgView) {            super();            imageView = imgView;//初始化        }          @Override        protected void onPreExecute() {            super.onPreExecute();//完成一些初始化工作,在执行后台耗时操作前被调用        }          @Override        protected Bitmap doInBackground(Integer... params) {            // TODO Auto-generated method stub            Bitmap bmp = null;            try {                id = params[0]; //参数根据自己需要进行传递                bmp = BitmapFactory.decodeResource(res, R.drawable.test);   //耗时的图像处理操作                             } catch (Exception e) {                  return null;            }            return bmp;        }          @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);//此处可用于更新进度条        }          @Override        protected void onPostExecute(Bitmap result) {            if (result != null&&imageView!=null) {                imageView.setScaleType(ScaleType.CENTER_CROP);//刷新后的结果图像就是result,将其赋值给响应的imageview即可完成UI刷新                imageView.setImageBitmap(result);                thumbnail[id].setImageBitmap(result);                thumbnail[id].setScaleType(ScaleType.FIT_XY);              } else {                  this.cancel(true);            }            super.onPostExecute(result);          }    调用代码如下:public class MainActivity extends Activity {private HorizontalScrollView scrollView = null;private Resources res = null;private LinearLayout filterLinearLayout = null;private ImageView[]thumbnail = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        scrollView = (HorizontalScrollView)findViewById(R.id.scrollView);        scrollView.setHorizontalScrollBarEnabled(false);        filterLinearLayout = (LinearLayout)findViewById(R.id.linearLayout);        filterLinearLayout.setHorizontalScrollBarEnabled(true);        res = this.getResources();        thumbnail = new ImageView[]{(ImageView)findViewById(R.id.img1),(ImageView)findViewById(R.id.img2),(ImageView)findViewById(R.id.img3),                (ImageView)findViewById(R.id.img4),(ImageView)findViewById(R.id.img5),(ImageView)findViewById(R.id.img6),(ImageView)findViewById(R.id.img7)};//这里加载了7个imageview对象,只是为了说明实例        for(int i=1;i<=7;i++)        {             ThumbnailGenerateTask task = new ThumbnailGenerateTask(thumbnail[i-1]);//为每一次刷新定制异步任务            task.execute(i-1);        }    } 


执行这个程序,你就会发现,图像时一张一张刷新出来的,而不是等待一段时间后一下刷新的!异步任务其实就是把ThumbnailGenerateTask 这个类中的框架按照你的需求填满而已,这个实例非常简单,相信大家能看的明白,最后给个实例源码连接,可以测试下!点击打开链接

更多相关文章

  1. 乐博Android客户端发布
  2. Android(安卓)sdcard媒体文件更新(程序控制刷新MediaStore数据库)
  3. [置顶] [Android] 随时拍图像处理部分总结及源码分享
  4. android面试题总结加强再加强版(四)
  5. [Android] 图像处理整合之处理ColorMatrix和Intend传递路径显示
  6. Android(安卓)apps 拍立知-功能实现2(相机/选择相册及图像识别调
  7. 都9102年了,Android(安卓)冷启动优化除了老三样还有哪些新招?
  8. Android(安卓)怎么实现newbility的下拉刷新和加载更多的ListView
  9. 【Android企业级开发案例分享】仿西瓜视频主页面框架,自定义GridL

随机推荐

  1. Android(安卓)Memory Management, OutOfM
  2. 在Android(安卓)Studio 2.2上集成OpenCV
  3. github项目解析(五)-->android日志框架
  4. Android(安卓)Retrofit 2.0(一)初次见面请
  5. Android不完全退出主Activity的方法
  6. 10个 iOS 用户暂可以嘲笑 Android 的特点
  7. android高仿抖音、点餐界面、天气项目、
  8. Windows电脑:Android Studio 连接不上设备
  9. 2017年起至今的android各版本占比(持续更
  10. Android图表引擎aiCharts for Android v1