【问题标题】:Error 'java.lang.String com.example.bookretrofit.Imagelink.getSmallThumbnail()' on a null object reference using Glide使用 Glide 在空对象引用上出现错误“java.lang.String com.example.bookretrofit.Imagelink.getSmallThumbnail()”
【发布时间】:2021-03-02 12:13:16
【问题描述】:

Logcat 错误(当没有找到图像时,它无法在 glide 中处理 null 异常)。我无法输入 if/else 语句。

2020-11-19 10:46:27.887 9386-9386/com.example.bookretrofit E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.bookretrofit, PID: 9386
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.bookretrofit.Imagelink.getSmallThumbnail()' on a null object reference
    at com.example.bookretrofit.RecyclerViewAdapter.onBindViewHolder(RecyclerViewAdapter.java:56)
    at com.example.bookretrofit.RecyclerViewAdapter.onBindViewHolder(RecyclerViewAdapter.java:19)
    at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
    at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
    at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:288)
    at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:345)
    at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:361)
    at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:368)
    at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:399)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:7548)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

RecyclerViewAdapter

    public void onBindViewHolder(@NonNull MyViewHolder holder, int i) {

    VolumeInfo volumeInfo = this.volumeInfo.get(i).getVolumeInfo();
    holder.tvTitle.setText(volumeInfo.getTitle());
    if (volumeInfo.getAuthors() != null && !volumeInfo.getAuthors().isEmpty()) {
        holder.tvAuthor.setText(volumeInfo.getAuthors().get(0));
    } else  {
        holder.tvAuthor.setText("NO AUTHOR");
    }
    Glide.with(mContext).load(volumeInfo.getImageLinks().getSmallThumbnail()).into(holder.ivThumbnail);

如果图像加载为空,我想从 Drawable 返回默认图像。如何使用 if/else 语句来做到这一点。这部分代码造成了所有问题

Glide.with(mContext).load(volumeInfo.getImageLinks().getSmallThumbnail()).into(holder.ivThumbnail);

【问题讨论】:

    标签: android-studio if-statement retrofit android-glide


    【解决方案1】:

    从堆栈跟踪我想你可以简单地做

    if (volumeInfo.getImageLinks() == null) {
       holder.ivThumbnail.setImageDrawable(null);
    } else {
     Glide.with(mContext)
        .load(volumeInfo.getImageLinks()
              .getSmallThumbnail())
              .into(holder.ivThumbnail);
    }
    

    好像volumeInfo.getImageLinks() 为空。

    【讨论】:

    • 非常感谢它的工作,错误消失了。我还有一个问题要问你.. 当找不到图像时如何从可绘制图像中显示图像。这部分代码如何实现 holder.ivThumbnail.setImageDrawable(null) @Fred
    • 恐怕我不明白这个问题。您需要代码的哪一部分?从资源文件夹中读取内容?
    • 哈哈别怕。好吧,让我再给你解释一下。在(RecyclerViewAdapter)代码中,如果作者姓名存在或不使用 if/else 语句,我检查了作者姓名。如果它存在于 url 中,则设置作者姓名的文本,但如果不存在,则显示“没有作者”。同样,在 Glide 中,我们放置 if/else 语句.. 如果找到图像 url,它将设置图像,但如果图像 url 为空,那么我想从可绘制文件夹中设置默认图像,而不仅仅是空白屏幕,因为在我的应用在找不到图像时显示空白图像视图@Fred
    • 你说的是holder.ivThumbnail.setImageResource(R.drawable.whatever_you_named_your_img)吗?
    • 这是一种不同的方法。不是setImageDrawable,而是setImageResource
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    相关资源
    最近更新 更多