为Android App存储/填充图像的最佳方法是什么?

时间:2015-03-27 02:09:57

标签: android

我对Android很新,我遇到了第一个问题,我似乎无法找到答案。这是我的问题:

我的应用程序将使用项目列表,每个列表行都有图像,点击后,相同的图像和项目的更多信息将显示在新活动中。但是,可能需要显示100-500(或更多)图像。到目前为止,我只测试了我的应用程序约有6个项目,因此内存在当前时间不是问题,但是当我与朋友讨论我的应用程序时,他提出了将图像放在图像托管上的建议站点并使用URL来引用它们。

我的问题是:网址引用方法是否是大量图片的最佳解决方案,还是以不同的方式做得更好?

如果这已经得到解答,我在搜索时忽略了它,我道歉并要求你指出我正确的方向。

感谢。

2 个答案:

答案 0 :(得分:0)

我认为"网址参考"是一个好主意。不要担心很多图像。它不会使用太多内存因为ListView(或RecyclerView)缓存不同的视图。在List中,你可以显示一些较小的iamges(例如100x100),但是在另一个活动中,你可以显示真实尺寸的图像。它不是同一个图像,有两个图像。

您可以查看这些库:

Android-Universal-Image-Loader

Picasso

Glide

答案 1 :(得分:0)

我建议使用2件事。第一个是 LruCache 来存储每个位图(参见http://developer.android.com/reference/android/util/LruCache.html)。这将负责管理是否需要从磁盘重新加载位图。 你应该做的第二件事是使用自定义适配器的 ListView 来提供你的观点,以便它可以回收它们(而不是只在中有一个 LinearLayout ScrollView 或其他东西)。适配器通过获取现有视图并仅为特定索引设置内容来工作。例如,如果您有一个项目数组,并且每个项目都有要显示的图像和文本,您将创建一个适配器,其中包含项目列表并将其设置在 ListView < / strong>即可。 ListView会跟踪显示的项目,并为每个项目调用 getView(int position,View convertView,ViewGroup parent)。如果该位置的该类型的项目已存在该视图,则传入的 convertView 将是当前未使用的视图。在这种情况下,只需在其上设置图像和文本。 如果它为null,则表示所有可用视图都在使用中,因此您需要为新视图充气。在这种情况下给它充气,然后在上面设置图像/文字。

例如,您的适配器可能如下所示:

public class MyListAdapter extends BaseAdapter {
    public class MyListItem {
        String ImagePath;
        String Text;
    }

    ArrayList<MyListItem> mItems;
    LayoutInflater mInflater;
    Context mContext;

    public MyListAdapter(Context context, ArrayList<MyListItem> items) {
        mItems = items;
        mContext = context;
        mInflater = LayoutInflater.from(mContext);
    }

    @Override
    public int getCount() {
        return mItems.size();
    }

    @Override
    public MyListItem getItem(int position) {
        return mItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        // If you have more than 1 type of view, give each an ID
        //    and return the ID for the view you want to display
        //    at this position in the array list.
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {  
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.SOME_VIEW_ID, null);

            // Perhaps set some layout parameters on convertView.
        }

        // Get the item at this position
        MyListItem item = getItem(position);

        // Set properties on the convertView here
        //    For the sake of example, pretend we have a View class
        //    called "ExampleView" with setImagePath and setText methods.
        //    setImagePath could lookup the path in an LruCache and load it
        //    it from disk if it isn't in there.
        ExampleView someCustomView = (ExampleView)convertView;
        someCustomView.setImagePath(item.ImagePath);
        someCustomView.setText(item.Text);

        return convertView;
    }
}