【问题标题】:Set image url to NetworkImageView using Data binding gives FileNotFoundException使用数据绑定将图像 url 设置为 NetworkImageView 会给出 FileNotFoundException
【发布时间】:2017-12-04 06:42:21
【问题描述】:

我正在使用 Volley 库从服务器获取图像并使用 RecyclerView 中的 NetworkImageView 显示它。当我使用 Android Data Binding 时,我遇到了异常。

Unable to decode stream: java.io.FileNotFoundException: open failed: ENOENT (No such file or directory)
resolveUri failed on bad bitmap uri

虽然使用务实的方法(从适配器本身调用 setImageUrl),但我可以显示图像。

  @BindingAdapter("imgurl")
   public void setImageUrl(NetworkImageView view, String imageURL) {
    Context context = view.getContext();
    ImageLoader mImageLoader = CustomVolleyRequestQueue.getInstance(context).getImageLoader();
    try {
        ImageLoader.getImageListener(view, R.drawable.story_big_default, R.drawable.story_big_default);
        Log.d("STORYMODEL", "setImageUrl: "+imageURL.trim());
        view.setImageUrl(imageURL.trim(), mImageLoader);
    } catch (Exception e) {
        e.printStackTrace();
        view.setImageResource(R.drawable.story_big_default);
    }
}

   <com.android.volley.toolbox.NetworkImageView
    android:id="@+id/ivBackground"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:background="@drawable/story_small_default"
    android:scaleType="fitXY"
    android:src="@{storymodel.imgurl}" />

请帮忙,我可能在这里遗漏了什么?

【问题讨论】:

    标签: android android-recyclerview android-volley android-databinding networkimageview


    【解决方案1】:

    这可能是由imageURL.trim()引起的,网址可能有空格使用replace(" ","%20")

    【讨论】:

    • 可能有什么不同?无论如何,我尝试使用 "replace" ,结果是一样的。我认为它与数据绑定更相关,而不是 URL,因为它在从 RecyclerView 的适配器调用时完美地工作。
    • 带有空格的 url 可能会产生 URISyntaxException 异常,记录的 url 是什么?
    • 图片在服务器上可用,当我在浏览器中点击 url 时,我可以查看它。我得到的例外是 FileNotFound 在这种情况下很奇怪。
    • 是否给了存储权限?
    • 是的,已授予存储权限。就像我说的,我得到的错误只是当我集成了 android 数据绑定时。
    【解决方案2】:

    我通过更改 BindingAdapter 参数解决了这个问题。这与 Model 和 Imageview 中的数据项之间的映射有关。 https://mobikul.com/data-binding-part-ii-image-binding/

    【讨论】:

      【解决方案3】:
      <com.android.volley.toolbox.NetworkImageView
              android:id="@+id/campaign_logo"
              android:layout_width="80dp"
              android:layout_height="80dp"           
              android:adjustViewBounds="true"
              android:background="@drawable/border_rectangle"
              android:padding="2dp"
              app:imageUrl="@{helper.brandLogo}" />
      

      在您的图像视图中,在命名空间“app”下创建一个新属性“imageUrl”。并在您的数据绑定助手类或 pojo 中创建如下方法和字符串值“brandLogo”。用图片的url初始化这个变量的值。

      @BindingAdapter("imageUrl")
      public static void getBrandLogo(View view, String imageUrl) {
          NetworkImageView imageView = (NetworkImageView) view;
          imageView.setImageUrl(imageUrl, imageLoader);
      }
      

      **如果您使用过 Volley,您必须了解使用 ImageLoader 从网络加载图像,或者您可以使用 Picasso 或其他库以相同的方法加载

      此外,您还可以添加占位符,按照与上述相同的步骤创建新属性并将绑定适配器注释编辑为

      @BindingAdapter("imageUrl", "placeholder", requireAll = false/true)
      

      【讨论】:

        【解决方案4】:
         <de.hdodenhof.circleimageview.CircleImageView
                            android:layout_width="@dimen/margin_80"
                            android:layout_height="@dimen/margin_80"
                            android:background="@drawable/ic_user_placeholder"
                            app:srcProfilePhoto="@{profileData.profilePhoto}" // pass url
                            app:civ_border_color="@color/gray"
                             />
        

        最后在java文件中使用下面的代码

        @BindingAdapter("app:srcProfilePhoto")
            public static void srcProfilePhoto(ImageView view, String imageUrl) {
                if (!TextUtils.isEmpty(imageUrl)) {
                    RequestOptions options = new RequestOptions()
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .placeholder(R.drawable.ic_user_placeholder);
                    Glide.with(view.getContext())
                            .load(imageUrl)
                            .apply(options)
                            .into(view);
                }
            }
        

        【讨论】:

          【解决方案5】:

          使用 Picasso 库在 ImageView 中加载图像替换 NetworkImageView

          例如,

          ImageView thumbNail;
          

          用于在 Imageview 中加载图像,

          Picasso.with(activity).load(url).noFade().into(thumbNail);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多