2012-04-03 17 views
1

ich auf Android-Anwendung arbeiten, die Inhalte aus dem Internet mit JSON nimmt, lade ich die JSON in der lokalen Datenbank einen Service, ich habe zwei Haupt Zweifel:Android dynamisches Bild Laden

1- Wie kann man sagen die Anwendung, dass die DB mit neuen Daten geladen wird, um die Anzeige neu zu laden.

2- Ich habe Bilder URL in der DB gespeichert, die angezeigt werden müssen, um anzuzeigen, dass ich das Standard-FrameLayout mit Fortschrittsbalken und Bildansicht erweitert habe, zeigt das neue Frame-Layout die Fortschrittsbalken, wenn das Bild ist noch nicht geladen, und wenn das Bild geladen ist, wird es angezeigt, außerdem hat das neue FreamLayout eine Klasse, die AsyncTask erweitert, die eine URL-Überprüfung des Bilds auf dem Dateisystem durchführt, und wenn es nicht existiert, findet der Download des Bildes statt. Unten ist das Beispiel der Klasse, die ich gemacht habe. Ist das der richtige Weg? und in diesem Fall habe ich einige Bilder, die beim Herunterladen beschädigt werden, wie man dieses Problem löst?

Danke für die Unterstützung.

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(); 

} 
} 

Antwort

0

Ich fand diese großartige Bibliothek auf github.com (nostra13/Android-Universal-Image-Loader (Java)) es ist perfekt und macht den Job mit Optionen wie Caching auf Festplatte und Speicher und Kassieren Größe.

Das Gold-ole ist: Setzen Sie das Rad nicht neu erfinden :)

0

für die erste Frage

  • Sie eine Absicht aus dem Dienst übertragen können Sie die Datenbank laden verwenden ... jetzt für den Empfänger in der Anwendung registrieren .. und in OnReceive Verfahren des Empfängers Sie den Code toreload und Display setzen können ..

und für die zweite Frage

012.351.
  • Die Logik, die Sie verwenden scheint korrekt zu sein .. aber ich konnte nicht bekommen, was Sie mit "einige Bilder werden beim Herunterladen beschädigt" .. was passiert, wenn sie beschädigt sind ..?
  • +0

    Teil des Bildes ist appering richtig und der Rest nicht korrekt Pixel anzeigt, das beschädigte Bild anzeigt wie beim Herunterladen und der Download-Anschlag in Der PC, Sie sehen die nicht heruntergeladenen Teile schwarz. – Nullity