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 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝