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

来源:互联网 发布:教师培训网络课程平台 编辑:程序博客网 时间:2024/05/01 09:45
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(),一般用来展示进度条
AsyncTask详细
1 0