Android通用图像加载器和图像持久性

时间:2014-05-20 07:59:42

标签: android android-asynctask download universal-image-loader

我正在下载并在我的Android应用中保存一些图片。

以下是完成工作的课程:

public class BitmapPersist extends AsyncTask<String, Void, Boolean> {

private ArrayList<String> photosNotDownloaded;
private File pointDir;
private KickstartrGeolocPoint point;
private OnBitmapPersistedListener onBitmapPersistedListener;

public BitmapPersist(ArrayList<String> photosNotDownloaded, File pointDir, KickstartrGeolocPoint point, OnBitmapPersistedListener onBitmapPersistedListener) {
    this.photosNotDownloaded=photosNotDownloaded;
    this.pointDir=pointDir;
    this.point=point;
    this.onBitmapPersistedListener=onBitmapPersistedListener;
}

@Override
protected Boolean doInBackground(String... params) {
    Bitmap bmp;
    FileOutputStream out = null;
    for(String url : photosNotDownloaded) {

        //download the picture synchronously
        bmp = ImageLoader.getInstance().loadImageSync(url);

        try {
            out = new FileOutputStream(pointDir.getPath() + File.separator + FileUtils.getPointPhotoPrefix(point) + FileUtils.getFileNameFromUrl(url));
            bmp.compress(Bitmap.CompressFormat.JPEG, 90, out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (Throwable ignore) {
            }
        }

        //send notification to the UI in order to scan again the directory and update the carousel
        publishProgress();
    }

    return true;
}

@Override
protected void onPostExecute(Boolean success) {
    if (success)
        onBitmapPersistedListener.persistedSuccessfully(this.point, this.pointDir);
    else
        onBitmapPersistedListener.errorInPersistance();
}

@Override
protected void onProgressUpdate(Void... values) {
    super.onProgressUpdate(values);
    onBitmapPersistedListener.onProgress();
}
}

此类在参数中获取url的ArrayList,并为每张照片下载并保存。 每次持久保存照片时,都会向视图发送通知以更新轮播(感谢publishProgress();) 问题是publishProgress()不起作用,每张照片都是在下载每张照片的同时显示的。

这是我的asynctask的调用:

 private void persistImageforPoint(ArrayList<String> photosNotDownloaded, KickstartrGeolocPoint point, File pointDir) {
    // Create a subfolder for each point with its id
    if (!pointDir.exists()) {
        if (!pointDir.mkdirs()) {
            LogWrapper.debug(FileUtils.class, "Failed to create directory");
            return;
        }
    }

    //save the file. Asynchronous task --> do not block the UI
    new BitmapPersist(photosNotDownloaded, pointDir, point, new OnBitmapPersistedListener() {

        @Override
        public void persistedSuccessfully(KickstartrGeolocPoint point, File pointDir) {
            if(currentPoint!=null) {
                File pointDirectory = FileUtils.getPointPhotoDir(getActivity(), currentPoint);
                loadCarousel(currentPoint, pointDirectory);
            }
        }

        @Override
        public void errorInPersistance() {
            LogWrapper.error(getClass(),"Error persisting image");
        }

        @Override
        public void onProgress() {
            if(currentPoint!=null) {
                final File pointDir = FileUtils.getPointPhotoDir(getActivity(), currentPoint);
                loadCarousel(currentPoint, pointDir);
            }
        }
    }).execute();
}

我的logcat中没有任何错误。

感谢您的帮助;)

0 个答案:

没有答案