freedom_wings4 2016-08-05 12:43 采纳率: 0%
浏览 1271

安卓,异步加载网络图片,其中遇到关于获取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条回答 默认 最新

  • freedom_wings4 2016-08-05 12:47
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog