Android中的视频缩略图加载速度慢

时间:2016-02-23 12:28:52

标签: android gridview video-thumbnails

您好我在这里创建了一个视频播放应用。其中我使用gridview for Video包含缩略图和视频标题。 但它需要太多的时间来加载,当它加载到gridview时,它也会出现滑动问题(慢)。 这是我的代码

  

MainActivity

public class MainActivity extends Activity {
ArrayList<AllVideoModel> allVideoList;
AllVideoListAdapter adapter;
GridView gridView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    gridView = (GridView) findViewById(R.id.gridView);
    allVideoList = listVideo(MainActivity.this);
    adapter = new AllVideoListAdapter(MainActivity.this, MainActivity.this, allVideoList);
    gridView.setAdapter(adapter);
}

public ArrayList<AllVideoModel> listVideo(Context context) {
    ArrayList<AllVideoModel> allVideoModelsList = new ArrayList<>();
    Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {MediaStore.Video.VideoColumns.DATA};
    Cursor c = context.getContentResolver().query(uri, projection, null,
            null, null);
    if (c != null) {
        while (c.moveToNext()) {

            AllVideoModel model = new AllVideoModel();
            String videoPath = c.getString(0).toString();
            String videoTitle = videoPath.substring(videoPath.lastIndexOf("/") + 1);
            model.setVideoTitle(videoTitle);
            model.setVideoPath(videoPath);
            allVideoModelsList.add(model);
        }
        c.close();
    }
    return allVideoModelsList;
  }
}
  

AllVideoListAdapter

public class AllVideoListAdapter extends BaseAdapter {
Context context;
ArrayList<AllVideoModel> allVideoModelArrayList;
LayoutInflater inflater;

public AllVideoListAdapter(Context context, ArrayList<AllVideoModel> allVideoModelArrayList) {
    this.context = context;
    this.allVideoModelArrayList = allVideoModelArrayList;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

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

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

private class Holder {
    ImageView image;
    TextView text;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Holder holder = new Holder();

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.grid_layout_video, parent, false);
        holder.image = (ImageView) convertView.findViewById(R.id.image);
        holder.text = (TextView) convertView.findViewById(R.id.text);
        convertView.setTag(holder);
    } else {
        holder = (Holder) convertView.getTag();
    }
    Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(allVideoModelArrayList.get(position).getVideoPath(), MediaStore.Video.Thumbnails.MICRO_KIND);
    holder.image.setImageBitmap(bitmap);
   /* ImageLoader.getInstance().displayImage("", holder.image,
            DisplayImageOption.getDisplayImage(),
            new AnimateFirstDisplayListener());*/
    holder.text.setText(allVideoModelArrayList.get(position).getVideoTitle());
    return convertView;
  }
}
  

AllVideoModel

public class AllVideoModel {
String VideoTitle, VideoPath;

public String getVideoTitle() {
    return VideoTitle;
}

public void setVideoTitle(String videoTitle) {
    VideoTitle = videoTitle;
}

public String getVideoPath() {
    return VideoPath;
}

public void setVideoPath(String videoPath) {
    VideoPath = videoPath;
  }
}

我认为它应该通过缓存缩略图解决,但我无法得到它。

1 个答案:

答案 0 :(得分:0)

优化的一些要点:

  • 如果您的应用使用CursorAdapter代替BaseAdapter+ArrayList,则不再需要提前加载所有网格项,而只需加载那些可见的网格项。如果您的设备上有许多视频,这一点很重要。
  • 如果你使用MediaStore.Video.Thumbnails.getThumbnail代替ThumbnailUtils.createVideoThumbnail...),android可以为你做拇指创建和缓存。

我做了类似照片的事情。有关详细信息,请参阅https://github.com/k3b/APhotoManager/blob/FDroid/app/src/main/java/de/k3b/android/androFotoFinder/gallery/cursor/GalleryCursorAdapter.java