将图像加载到 android 的最佳方式

the best way to load images into android

我在 Sql 服务器中将图像存储为类型 'image'(字节) 现在我会在我的应用程序中恢复它 android 我尝试将它作为字节 64 发送到 android 但我遇到了内存不足的问题 我找到了一些解决方案,比如从 php 发送图像的 link 并将其加载到 android 但我不知道如何获取图像的 URL(字节)并发送?

RecyclerView 适配器:

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.MyTag>{
LayoutInflater inflater;
DbConnection db ;
CnxExternal myConex = new CnxExternal();
ArrayList<Map<String, String>> listitem;
private CardAdapter.MyTag holder;
Context ctx;
ArrayList<byte[]> img , imgfou ;
ArrayList<String>nomesFo,descriptions;
String codeBar;
ArrayList<Integer>idfourns;



public CardAdapter(Context context, ArrayList<Map<String, String>> list,ArrayList<byte[]>imagbyt,ArrayList<String>names,ArrayList<Integer>idf,String cod,ArrayList<String>Description,ArrayList<byte[]>imagfour) {
    super();
    this.inflater = LayoutInflater.from(context);
    this.listitem = list;
    ctx=context;
    this.img=imagbyt;
    this.nomesFo=names;
    this.idfourns=idf;
    this.codeBar=cod;
    this.imgfou=imagfour;
    this.descriptions=Description;
    db =new DbConnection(ctx);

}

public class MyTag extends RecyclerView.ViewHolder {
    TextView price;
    TextView name;
    ImageView img;
    TextView namfou;
    TextView rating;
    FloatingActionButton btnlike;

    CardView cardView;
    public MyTag(View view) {
        super(view);
        //for animat
cardView=(CardView)view.findViewById(R.id.card_view);

        price = (TextView) view.findViewById(R.id.prixprodtestcard);
        name = (TextView) view.findViewById(R.id.nomprodtestcard);
        namfou=(TextView) view.findViewById(R.id.qtestockcard);
        rating=(TextView)view.findViewById(R.id.rating);
        img = (ImageView) view.findViewById(R.id.imageprodcard);
        btnlike = (FloatingActionButton) view.findViewById(R.id.likeButtoncard);
}
}


@Override
public MyTag onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, null);

    return new MyTag(v);
}


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


@Override
public void onViewRecycled(MyTag holder) {
    super.onViewRecycled(holder);
    Glide.clear(holder.img);
}

public void onBindViewHolder(final MyTag holder, final int position) {

    //anim fadein
    YoYo.with(Techniques.SlideInUp)
            .playOn(holder.cardView);

    final HashMap<String, String> map = (HashMap<String, String>)listitem.get(position);


    if(map.get("like").equals("0")){
        holder.btnlike.setImageResource(R.drawable.heart);
    }else{
        holder.btnlike.setImageResource(R.drawable.ic_liked);

    }
    holder.img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(ctx,InformationsProduit.class);
            i.putExtra("nomProd",map.get("name"));
            i.putExtra("prix",map.get("price"));
            i.putExtra("nomFour",nomesFo.get(position));
            i.putExtra("image",img.get(position));
            i.putExtra("telFour",map.get("telefournisseur"));
            i.putExtra("addrFour",map.get("adressFou"));
            i.putExtra("idFour",idfourns.get(position));
           i.putExtra("description",descriptions.get(position));
            i.putExtra("codeBar",codeBar);
            ctx.startActivity(i);
        }
    });

    holder.price.setText(map.get("price"));
    holder.name.setText(map.get("name"));
    holder.namfou.setText(nomesFo.get(position));
    holder.rating.setText(map.get("rating"));


    Glide.with(ctx)
            .load(imgfou.get(position))
            //.diskCacheStrategy( DiskCacheStrategy.NONE )
            //.skipMemoryCache( true )
            .thumbnail(0.1f)
            .into(holder.img);


    holder.btnlike.setOnClickListener(new View.OnClickListener() {
        CardAdapter.MyTag hld=holder;
        int pos=position;
        @Override
        public void onClick(View arg0) {

            HashMap<String, String> mapclicked = (HashMap<String, String>)listitem.get(pos);
            if(mapclicked.get("like").equals("0"))
            {
                hld.btnlike.setImageResource(R.drawable.ic_liked);
                mapclicked.put("like", "1");


                Snackbar snackbar;
                snackbar = Snackbar.make(hld.btnlike, "Bien ajouter au prefere", Snackbar.LENGTH_SHORT);
                View snackBarView = snackbar.getView();
                snackBarView.setBackgroundColor(Color.GREEN);
                TextView textView = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_text);
                textView.setTextColor(Color.WHITE);
                snackbar.show();

                db.insertFav(codeBar,idfourns.get(pos) , map.get("name") , map.get("price") , nomesFo.get(position) , map.get("adressFou") , map.get("telefournisseur") ,img.get(position) );

                hld.btnlike.startAnimation(animAdp());

            }else{
                hld.btnlike.setImageResource(R.drawable.heart);
                mapclicked.put("like", "0");

        Snackbar.make(hld.btnlike, "Removed from prefere" , Snackbar.LENGTH_LONG).setAction("Action", null).show();

                db.deleteR(codeBar,idfourns.get(pos));
                hld.btnlike.startAnimation(animAdp());
            }
        }}
    );



}`

PHP 函数:

$res=sqlsrv_next_result($stmt);
while($res){

    while($data=sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
    {
    array_push($information,array(
            ...
            "image"=>base64_encode($data['image']),

            "imgfour"=>base64_encode($data['imagefournisseur']),
                    ));

}
    $res=sqlsrv_next_result($stmt);
}
echo json_encode(array('produits'=>$information));

        }

******************问题*********************** 问题是因为这个大 json 文件和带有图像的大数组列表。不是使用二十张图片的回收视图。 @greenapps

更好的方法是将您的图片存储在服务器上,可以像这张图片一样使用 http 公开访问 - https://pbs.twimg.com/profile_images/450103729383956480/Tiys3m4x.jpeg

当您有路径时,您可以使用可用于 Android ( Glide , Picasso , Fresco) 的图像加载库在您的应用程序中有效地加载它,而不会出现内存不足异常

为什么要将字节数组编码为 base64 字符串?只是回应字节。您不必在服务器上创建字节文件 在两个答案中提出。

php 输出字节的脚本与直接 link 服务器上的图像文件一样好。

你可以像这样简单地使用 link

https://pbs.twimg.com/profile_images/450103729383956480/Tiys3m4x.jpeg

形成服务器并在android中显示然后使用“Picasso”图像加载库