安卓,异步加载网络图片,其中遇到关于获取imageview的大小的问题,求高手指点指点

图片说明

下面具体一点说明问题。
这是自己继承RecyclerView.Adapter的类的onBindViewHolder方法,每项是一个imageview和一个textview,imageview我固定宽高都是100dp

 public void onBindViewHolder(RecycleViewHolder viewHolder,int position)
    {
        String itemUri=uri.get(position);
        String itemText=text.get(position);
        TextView textView=viewHolder.textView;
        ImageView imageView=viewHolder.imageView;
        cacheLoader.load(itemUri, itemText, imageView,textView,position);
    }

这里调用的load方法用于启动线程池,进行异步网络图片加载

 public void beginToLoad(final ImageView imageView,final String uri,final String text,final TextView textView)
    {
        final int width=imageView.getWidth();
        final int height=imageView.getHeight();
        imageView.setTag(uri);

        Runnable runnable=new Runnable() {
            @Override
            public void run() {

                    try {
                        Result result = loadResult(width, height, uri, text);
                        if (result != null) {
                            LoaderResult loaderResult = new LoaderResult(result, imageView,textView);
                            Message msg = handler.obtainMessage();
                            msg.what = 1;
                            msg.obj = loaderResult;
                            handler.sendMessage(msg);
                        }
                    } catch (Exception e) {
                        Log.e("this", "加载的时候出错了 " + e);
                    }

            }

        };

这里中的loaderResult方法就是获取并加载图片的,其中会调用到以下这方法根据imageview大小(即reqWidth和reqHeight参数)计算bitmap的采样率。

 public int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight)
    {
        try {


            int inSampleSize = 1;
            int rawWidth = options.outWidth;
            int rawHeight = options.outHeight;
            while ((rawWidth / inSampleSize >= reqWidth) && (rawHeight / inSampleSize >= reqHeight))
            {
                inSampleSize = inSampleSize *2;
            }

            return inSampleSize;
        }catch(Exception e)
        {
            Log.e("this","在calculate中,除数为0"+e);
            return 1;
        }
    }

大概如上,ViewTreeObserver和view.post,我觉得不能保证加载图片的线程运行到计算采样率那里,高和宽一定能被算出来。至于view.measure,我本身imageview固定宽高都为100dp,但是这个方法,第一个参数int size,我传什么进去,getwidth,getheight就得到什么。
有大神指点指点吗

1个回答

第一段代码最后一行的load方法即是调用第二段代码,beginLoad方法的,补充一点

freedom_wings4
freedom_wings4 beginToLoad
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!