You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中漫画App图片加载异常问题求助

Android漫画App图片加载问题排查与修复

问题原因

  • readBitmapFile加载网络URL失败:BitmapFactory.decodeFile()仅用于读取本地文件路径,传入网络URL会直接抛出FileNotFoundException,系统无法将网络地址识别为本地文件。
  • getBitmapFromURL导致App崩溃:该方法在主线程中执行网络请求,Android从API 28开始严格禁止主线程进行网络操作,会触发NetworkOnMainThreadException导致App直接崩溃;未声明网络权限也会加剧问题。
  • 额外问题:Comics实体类中的图片设置方法名错误(Image()应为setImage()),且用Bitmap存储图片会占用大量内存,不符合性能优化规范。

修复方案

推荐使用成熟的图片加载库(如你已导入的Picasso)处理网络图片加载,它会自动处理线程调度、缓存、错误处理等问题,无需手动实现网络请求。

1. 修正Comics实体类

将Bitmap类型的image字段改为String类型存储图片URL,并修正方法名:

package edu.huflit.comicsapp1;

public class Comics {
    int id;
    String name;
    int category;
    int views;
    int likes;
    String imageUrl; // 改为存储URL字符串

    public Comics(String name, String imageUrl) {
        this.name = name;
        this.imageUrl = imageUrl;
    }

    public String getName() {
        return name;
    }

    public String getImageUrl() {
        return imageUrl;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setImageUrl(String imageUrl) { // 修正方法名
        this.imageUrl = imageUrl;
    }
}

2. 简化App类

移除手动实现的图片加载方法,仅保留数据初始化逻辑:

package edu.huflit.comicsapp1;

import android.app.Application;
import java.util.ArrayList;

public class App extends Application {
    public static ArrayList<Comics> data;

    @Override
    public void onCreate() {
        super.onCreate();
        if (data == null) {
            data = new ArrayList<>();
        }
    }

    public static ArrayList<Comics> initDataForComics(){
        data.add(new Comics("SakamotoDays", "https://i.pinimg.com/564x/57/2c/02/572c021d470fc2d22062d50a8df4a2cc.jpg"));
        return data;
    }
}

3. 修改ComicsAdapter使用Picasso加载图片

在onBindViewHolder中用Picasso直接加载URL到ImageView:

package edu.huflit.comicsapp1;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;

public class ComicsAdapter extends RecyclerView.Adapter<ComicsAdapter.ComicsVH> {

    ArrayList<Comics> lstComics;

    public ComicsAdapter(ArrayList<Comics> lstComics) {
        this.lstComics = lstComics;
    }

    @NonNull
    @Override
    public ComicsVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.comics_rows,parent,false);
        return new ComicsVH(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ComicsVH holder, int position) {
        Comics comics = lstComics.get(position);
        holder.titleComics.setText(comics.getName());
        // 使用Picasso加载网络图片
        Picasso.get()
                .load(comics.getImageUrl())
                .placeholder(R.drawable.placeholder) // 可选:加载时占位图
                .error(R.drawable.error) // 可选:加载失败占位图
                .into(holder.imgComics);
    }

    @Override
    public int getItemCount() {
        return lstComics.size();
    }

    static class ComicsVH extends RecyclerView.ViewHolder{
        ImageView imgComics;
        TextView titleComics;
        public ComicsVH(@NonNull View itemView) {
            super(itemView);
            imgComics = itemView.findViewById(R.id.imgComics);
            titleComics = itemView.findViewById(R.id.titleComics);
        }
    }
}

4. 声明网络权限

在AndroidManifest.xml中添加INTERNET权限(位于<application>标签外):

<uses-permission android:name="android.permission.INTERNET" />

5. 保持MainActivity不变

MainActivity的逻辑无需修改,数据初始化和Adapter绑定逻辑是正确的。

关键说明

  • 避免在主线程执行网络请求:所有网络操作必须放在子线程,图片库已自动处理。
  • 不要用Bitmap存储图片:直接存储URL更节省内存,且便于后续更新图片地址。
  • 图片库的优势:Picasso/Glide等库自带内存缓存、磁盘缓存,能大幅提升加载速度和用户体验。

内容的提问来源于stack exchange,提问作者Shillwi2593

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:17:09