关于UI在主线程操作的问题(handler和AsyncTask)

UI的更新只能在主线程进行更新:

在不使用handler的情况,之所以可以在适配器adapter上进行UI的更新:

        holder.tv_subject.setText(list.get(position).getSubject());
        holder.tv_summary.setText(list.get(position).getSummary());
        holder.tv_changed.setText(list.get(position).getChanged());
         holder.iv.setImageBitmap(bm);
是因为在adapter是在主线程进行setAdapter和New的,所以adapter就是在主线程中。相当于在主线程中UI的更新。

在异步任务中,只有 doInBackground方法不在主线程中,因为其进行耗时操作。其他都是在主线程中。

------------------------------------------------------------------------------------------------------------

在使用handler的情况下:
 holder.iv.setImageResource(R.mipmap.ic_launcher);
        final String imagePath=list.get(position).getCover();
//下载图片
   new Thread(new Runnable() {
            @Override
            public void run() {  // 开启一个子线程就可以取代LoadImageAsyncTask下载图片,简单方便
                if(HttpUtils.isNetWorkConn(context)){
                    byte[] buff=HttpUtils.getHttpResult(imagePath);
                    final Bitmap bm= BitmapFactory.decodeByteArray(buff,0,buff.length);
                    handler.post(new Runnable() {    //之所以要使用handler而不直接  holder.iv.setImageBitmap(bm);  是因为开启了一个子线程,子线程不能进行UI的更新,需要使用handler将信息回传到主线程中,于是就使用了:
                     handler.post(new Runnable() {
                        @Override
                        public void run() {
                            holder.iv.setImageBitmap(bm);
                        }
                    });


                        @Override
                        public void run() {
                            holder.iv.setImageBitmap(bm);
                        }
                    });
                }
            }
        }).start();

        holder.tv_subject.setText(list.get(position).getSubject());
        holder.tv_summary.setText(list.get(position).getSummary());
        holder.tv_changed.setText(list.get(position).getChanged());

---------------------------------------------------------------------------------------------------------------------------------------------------

在AsyncTask中,onPostExecute(List<Books> result) 和doInBackground(String... params)  

其中:
doInBackground(String... params),为后台的耗时操作。方法publishProgress()可更新任务进度。
onPostExecute(List<Books> result),为UI主线程调用,展示任务进度
onPreExecute(),一般用来展示进度条
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值