【问题标题】:How to cache images and text from data pulled from an API如何缓存从 API 提取的数据中的图像和文本
【发布时间】:2017-10-01 09:55:20
【问题描述】:

我的第一个应用程序需要一些帮助。我制作了一个旅行指南应用,它使用改造 API 从 JSON 中提取信息和图像链接。

我的应用程序在线运行良好,可以提取所有数据,但现在我希望用户能够在缓存后离线查看所有信息。

客户端 API

public static final String BASE_URL = "https://quarkbackend.com";
public static Retrofit retrofit = null;

public static Retrofit getClient(){
    if (retrofit==null){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}

服务接口

public interface Service {
    @GET("/getfile/beyond-infinity-gd/homepage")
    Call<AlbumsResponse> getHomepage();

    @GET("/getfile/beyond-infinity-gd/tours")
    Call<AlbumsResponse> getTours();

    ...

适配器

public class AlbumsAdapter extends RecyclerView.Adapter<AlbumsAdapter.MyViewHolder> {

private Context mContext;
private List<Album> albumList;

public AlbumsAdapter(Context mContext, List<Album> albumList) {
    this.mContext = mContext;
    this.albumList = albumList;
}

@Override
public AlbumsAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.album_card, viewGroup, false);

    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(final AlbumsAdapter.MyViewHolder viewHolder, int i) {
    viewHolder.title.setText(albumList.get(i).getTitle());
    viewHolder.count.setText(albumList.get(i).getSubtitle());

    //load album cover using picasso
    Picasso.with(mContext)
            .load(albumList.get(i).getThumbnail())
            .placeholder(R.drawable.load)
            .into(viewHolder.thumbnail);


}

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

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView title, count;
    public ImageView thumbnail;

    public MyViewHolder(View view) {
        super(view);
        title = (TextView) view.findViewById(R.id.title);
        count = (TextView) view.findViewById(R.id.count);
        thumbnail = (ImageView) view.findViewById(R.id.thumbnail);

        //on item click
        itemView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                int pos = getAdapterPosition();
                if (pos != RecyclerView.NO_POSITION){
                    Album clickedDataItem = albumList.get(pos);
                    Intent intent = new Intent(mContext, DetailActivity.class);
                    intent.putExtra("title", albumList.get(pos).getTitle());
                    intent.putExtra("subtitle", albumList.get(pos).getSubtitle());
                    intent.putExtra("body", albumList.get(pos).getBody());
                    intent.putExtra("thumbnail", albumList.get(pos).getThumbnail());
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    mContext.startActivity(intent);
                }
            }
        });
    }
}

【问题讨论】:

  • 我认为您可以将信息存储在 SQLite 中

标签: java android json picasso


【解决方案1】:

要缓存文本数据,您可以使用 SQLite。查看this 教程并缓存图像,您应该查看 Glide/Picasso 库。他们可以将图像存储在内存/磁盘中。

【讨论】:

  • 我一直在尝试使用 NetworkPolicy.OFFLINE 但它不适用于 .load(albumList.get(i).getThumbnail()) 它适用于简单的 .load(url) 但不是我的方法。
【解决方案2】:

我强烈建议你使用PicassoGlide 来缓存图片,或者你可以尝试按照这个官方的android guide 手动进行。

至于在原始数据类型的情况下存储文本数据,最快的方法是将数据存储在Shared Preferences。对于更复杂的业务逻辑和更多的能力,你应该使用SQLite

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2020-01-01
    • 2022-01-18
    相关资源
    最近更新 更多