안녕하세요 저는 Asyntask에서 구현하여 커서를 사용하여 이미지 및 비디오 파일의 썸네일을 가지고 있습니다. 이제 모바일에 500 개 이상의 파일이있는 경우 썸네일로드를 기다려야합니다.
그래서 비트 맵을 표시하는 데 문제가있는 비동기 로딩을 위해 universal-image-loader-1.6.1-with-src.jar을 사용했습니다.
범용 이미지 로더를 사용하여 모든 미리보기 이미지 (이미지 및 동영상 파일)를로드하는 방법은 무엇입니까? 나는 이것을 http://www.technotalkative.com/android-select-multiple-photos-from-gallery/ 사용하여 비동기 이미지 로더를 사용했지만 이미 Bitmap-bitList Arraylist (Thumbnail for Image and video)를 가지고 있습니다. gridview에서 해당 라이브러리를 사용하여 이러한 비트 맵을 표시 하시겠습니까?
내 코드 부분은
final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID }; // Images getting
final String orderBy = MediaStore.Images.Media.DATE_TAKEN;
imagecursor = mContext.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
null, orderBy);
int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID);
this.count = imagecursor.getCount();
bitList = new ArrayList<Bitmap>();
arrPathList = new ArrayList<String>();
selectedPath = new ArrayList<String>();
for (int i = 0; i < this.count; i++) {
imagecursor.moveToPosition(i);
int id = imagecursor.getInt(image_column_index);
int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA);
bitList.add( MediaStore.Images.Thumbnails.getThumbnail(
mContext.getContentResolver(), id,
MediaStore.Images.Thumbnails.MICRO_KIND, null));
arrPathList.add(imagecursor.getString(dataColumnIndex));
}
final String[] parameters = { MediaStore.Video.Media.DATA, MediaStore.Video.Media._ID, MediaStore.Video.Media.DURATION , MediaStore.Video.Media.MIME_TYPE}; // Videos getting
final String orderBy_v = MediaStore.Video.Media._ID;
videocursor = mContext.getContentResolver().query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, parameters, null,
null, orderBy_v);
int video_column_index = videocursor.getColumnIndex(MediaStore.Video.Media._ID);
for(int ii = 0; ii < videocursor.getCount(); ii ++){
videocursor.moveToPosition(ii);
int id_v = videocursor.getInt(video_column_index);
int datacolumn_v = videocursor.getColumnIndex(MediaStore.Video.Media.DATA);
long duration = videocursor.getInt(video_column_duration);
bitList.add(MediaStore.Video.Thumbnails.getThumbnail(mContext.getContentResolver(), id_v,
MediaStore.Video.Thumbnails.MICRO_KIND, null));
arrPathList.add(videocursor.getString(datacolumn_v));
}
미리 감사드립니다.
Lazy loading 개념을 사용하여 문제를 해결했습니다. 즉, 이미지 커서로 검색하고 비트 맵을 비트리스트 Arraylist에 저장 한 처음 15 개 이미지를 표시하고 뷰 끝에서 스크롤하여 매번 검색합니다.
내 코드 부분은 다음과 같습니다.
protected Integer doInBackground(Integer... params){ // here we passes first 15 and will pass next 15 for every scrolling at the end of the view
// TODO Auto-generated method stub
if(params[0] != null)
count = params[0];
if(count == 15) // this is for will show only 15 images in first attempt in the view
j = 0; // Maintain this variable as static
for(int i = j; i < count; i ++){
imgcursor.moveToPosition(i);
String mime_Type = imgcursor.getString(imgcursor.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE));
String fMime_type = mime_Type.substring(0,5);
if(fMime_type.equals("image")){
id = imgcursor.getInt(imgcursor.getColumnIndex(MediaStore.Images.Media._ID));
dataColumnIndex = imgcursor.getColumnIndex(MediaStore.Images.Media.DATA);
String date = imgcursor.getString((imgcursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN)));
if(Constants.DEBUG)Log.e(TAG, "Date of this file" +date);
if(bitList != null)
bitList.add( MediaStore.Images.Thumbnails.getThumbnail(
getContentResolver(), id,
MediaStore.Images.Thumbnails.MICRO_KIND, null));
durationcount.add(null);
mimeType.add(fMime_type);
arrPathList.add(imgcursor.getString(dataColumnIndex));
}
else
{
id = imgcursor.getInt(imgcursor.getColumnIndex(MediaStore.Video.Media._ID));
dataColumnIndex = imgcursor.getColumnIndex(MediaStore.Video.Media.DATA);
if(Constants.DEBUG)Log.e("Duration", "Duration of video :"+imgcursor.getString(dataColumnIndex));
String path = imgcursor.getString(dataColumnIndex);
File f = new File(path);
try {
FileInputStream in = new FileInputStream(f);
mRetriever.setDataSource(in.getFD());
String durations = mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); // getting duration of the every videos
long duration = Long.parseLong(durations);
if(Constants.DEBUG)Log.e(TAG, "Duration of file: "+duration);
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(duration),
TimeUnit.MILLISECONDS.toMinutes(duration) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration)),
TimeUnit.MILLISECONDS.toSeconds(duration) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)));
if(Constants.DEBUG)Log.e(TAG, "Duration of file Hms: "+hms);
durationcount.add(hms);
if(bitList != null)
bitList.add( MediaStore.Video.Thumbnails.getThumbnail(
getContentResolver(), id,
MediaStore.Video.Thumbnails.MICRO_KIND, null));
mimeType.add(fMime_type);
arrPathList.add(imgcursor.getString(dataColumnIndex));
in.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
j = count;
return null;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다