Android динамическая загрузка изображений - PullRequest
1 голос
/ 03 апреля 2012

Я работаю над приложением Android, которое получает контент из Интернета с использованием JSON, загружаю JSON в локальную базу данных с помощью службы, у меня есть два основных сомнения:

1 - Как узнать приложениечто БД загружена новыми данными для перезагрузки дисплея.

2 - У меня есть URL изображений, сохраненный в БД, который должен отображаться как будет, чтобы показать, что я расширил FrameLayout по умолчанию с помощью progressBar иПри просмотре изображений в новом макете кадра будет отображаться прогрессбар, если изображение еще не загружено, и если изображение загружено, оно будет отображаться, более того, у нового FreamLayout есть класс, расширяющий AsyncTask, который принимает URL-адрес, проверяющий, что изображение существует в файлесистема и, если она не существует, происходит загрузка изображения.ниже образец класса, который я сделал.Это правильный способ сделать это?и в этом случае у меня есть некоторые изображения, поврежденные при загрузке, как решить эту проблему?

Спасибо за помощь.

    public class ImageLoader extends FrameLayout
    {
private String imageURL;
private ImageView img;
private ProgressBar pb;
private boolean isLoaded;
File rootDir = new File("/data/data/com.ait.kw.pharmacy/files");
private static final String TAG = "FrameLayoutExpander";

    //defining file name and url
    public String fileName = "";
    public String fileURL = "";

public ImageLoader(Context context , AttributeSet attr) {
    super(context,attr);
    isLoaded = false;
    img = new ImageView(context , null);
    pb = new ProgressBar(context,null , android.R.attr.progressBarStyle);
    img.setVisibility(View.INVISIBLE);
    pb.setVisibility(View.VISIBLE);
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
            LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    super.addView(img,params);
    super.addView(pb,params);
    checkAndCreateDirectory("/images");

}

public ImageLoader(Context context, AttributeSet attr, int defaultStyle)
{
    super(context, attr, defaultStyle);
    isLoaded = false;
    img = new ImageView(context , null);
    pb = new ProgressBar(context,null , android.R.attr.progressBarStyle);
    img.setVisibility(View.INVISIBLE);
    pb.setVisibility(View.VISIBLE);
    super.addView(img);
    super.addView(pb);
    checkAndCreateDirectory("/images");
    isLoaded = checkImaeExists(rootDir.getAbsolutePath()+"/images/"+fileName);
  }
public void setImageResource(int resId) {
    pb.setVisibility(View.GONE);
    img.setVisibility(View.VISIBLE);
    img.setImageResource(resId);
  }

public void setImageDrawable(Drawable drawable) {
    pb.setVisibility(View.GONE);
    img.setVisibility(View.VISIBLE);
    img.setImageDrawable(drawable);
  }

public void startLoad(String url)
{
    setImageURL(url);
    loadImage();
}

public void setImageURL(String url)
{
    imageURL = url;
    fileName = imageURL.substring(imageURL.lastIndexOf("/")+1);
    isLoaded = checkImaeExists(rootDir.getAbsolutePath()+"/images/"+fileName);
}
public void loadImage() 
{
    if(! isLoaded)
    {
        DownloadFileAsync d = new DownloadFileAsync();
        d.execute(imageURL);
    }
    else
    {
        Drawable d = Drawable.createFromPath(rootDir + "/images/" + fileName);
        setImageDrawable(d);
    }
}
//this is our download file asynctask
class DownloadFileAsync extends AsyncTask<String, String, String> {


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }


    @Override
    protected String doInBackground(String... aurl) {

        try {
            //connecting to url
            URL u = new URL(imageURL);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();

            //lenghtOfFile is used for calculating download progress
            int lenghtOfFile = c.getContentLength();

            //this is where the file will be seen after the download
            FileOutputStream f = new FileOutputStream(new File(rootDir + "/images/", fileName));
            //file input is from the url
            InputStream in = c.getInputStream();

            //here's the download code
            byte[] buffer = new byte[1024];
            int len1 = 0;
            long total = 0;

            while ((len1 = in.read(buffer)) > 0) {
                total += len1; //total = total + len1
                publishProgress("" + (int)((total*100)/lenghtOfFile));
                f.write(buffer, 0, len1);
            }
            f.close();

        } catch (Exception e) {
            Log.d(TAG, e.getMessage());
        }

        return null;
    }

    @Override
    protected void onPostExecute(String unused) 
    {
        //dismiss the dialog after the file was downloaded
        isLoaded = true;
        Drawable d = Drawable.createFromPath(rootDir + "/images/" + fileName);
        setImageDrawable(d);
    }
}

//function to verify if directory exists
public void checkAndCreateDirectory(String dirName){
    File new_dir = new File( rootDir + dirName );
    if( !new_dir.exists() ){
        new_dir.mkdirs();
    }
}

public boolean checkImaeExists(String filename)
{
    File file = new File(filename);

    return file.exists();

}
}

Ответы [ 2 ]

0 голосов
/ 22 мая 2012

Я нашел эту замечательную библиотеку на github.com (nostra13 / Android-Universal-Image-Loader (Java)), она идеальна и выполняет такие функции, как кэширование на диске и памяти и размер кэширования.

Золотая оле: не изобретай велосипед :)

0 голосов
/ 03 апреля 2012

для 1-го вопроса

  • Вы можете передать намерение из службы, которую вы используете для загрузки базы данных ... теперь зарегистрируйтесь для получателя в вашем приложении ... и в методе onreceive получателя вы можете поместить код для перезагрузки и отображения ..

и для 2-го вопроса

  • Логика, которую вы используете, кажется правильной ... но я не могу понять, что вы имели в виду, когда "некоторые изображения портятся при загрузке" ... что происходит, когда они повреждены ..?
...