2010-10-07 45 views
0

我的应用程序将.png文件下载到SD卡中供以后使用。我不断收到OutOfMemoryErrors(如果有人可以解释这一点,那太棒了!),所以我看了一下保存在SD卡上的图像大小,它们大概是服务器上的大小的两倍。为什么会这样,我怎样才能让它变小?png下载的大小与服务器大小不同?

public void onCreate(Bundle saved) { 

    setContentView(R.layout.namedrxnscreen); 
    TextView t1 = (TextView)findViewById(R.id.rxn_text1); 
    TextView t2 = (TextView)findViewById(R.id.rxn_text2); 
    TextView t3 = (TextView)findViewById(R.id.rxn_text3); 
    TextView t4 = (TextView)findViewById(R.id.rxn_text4); 
    iv = (ImageView) findViewById(R.id.rxn_image); 
    pb = (ProgressBar) findViewById(R.id.rxn_loading); 
    vs = (ViewSwitcher) findViewById(R.id.rxn_switch); 

    try { 

     super.onCreate(saved); 
     [ boring stuff here ] 

     BitmapDrawable image = getImage(c.getString(5)); 
     if (image != null) { 
      iv.setImageDrawable(getImage(c.getString(5))); 
      iv.setBackgroundColor(Color.WHITE); 
      vs.setDisplayedChild(1); 
     } 
     else { 
      new DownloadTask().execute(c.getString(5)); 
     } 

    } 
    catch (ArrayIndexOutOfBoundsException ea) { 
     error = "bah!"; 
     showDialog(1); 
    } 
    catch (Exception ex) { 
     error = ex.getMessage(); 
     showDialog(1); 
    } 
} 

protected class DownloadTask extends AsyncTask<String, Integer, Bitmap> { 

    @Override 
    protected Bitmap doInBackground(String... string) { 

     Bitmap d = null; 

     try { 

      DefaultHttpClient dhc = new DefaultHttpClient(); 
      HttpGet request = new HttpGet(HTTP_BASE + string[0] + ".png"); 
      HttpResponse response = dhc.execute(request); 
      BufferedInputStream webstream = new BufferedInputStream(response.getEntity().getContent()); 
      d = writeToSd(string[0], webstream, d); 

     } 
     catch (Exception ex) { errorCatch(ex.getMessage()); } 

     return d; 

    } 

    private Bitmap writeToSd(String string, BufferedInputStream webstream, Bitmap d) { 

     try { 

      webstream.mark(3); 
      webstream.reset(); 
      File f = new File(Environment.getExternalStorageDirectory() + SD_DIR); 
      f.mkdirs(); 
      File f2 = new File(f, string + ".png"); 
      f2.createNewFile(); 
      BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(f2)); 

      int len; 
      byte[] buffer = new byte[1024]; 
      while ((len = webstream.read(buffer)) > 0) { 

       fos.write(buffer, 0, len); 

      } 

      webstream.close(); 
      //fos.flush(); 
      fos.close(); 

      FileInputStream fis = new FileInputStream(new File(f, string + ".png")); 
      d = BitmapFactory.decodeStream(fis); 
      return d; 

     } 
     catch (Exception ex) { 

      errorCatch(ex.getMessage()); 
      return null; 

     } 


    } 

    protected void onPostExecute(Bitmap result) { 

     if (result != null) { 
      iv.setImageBitmap(result); 
      iv.setBackgroundColor(Color.WHITE); 
      vs.setDisplayedChild(1); 
     } 

    } 

} 

protected BitmapDrawable getImage(String name) { 

    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 

     try { 

      //Gets the SD card file, whacks it in a stream 
      File f = new File(Environment.getExternalStorageDirectory() + SD_DIR, name + ".png"); 

      if (f.exists()) { 

       InputStream s = new FileInputStream(f); 

       try { 

        //Return the decoded bitmap 
        BitmapDrawable d = new BitmapDrawable(getResources(), 
          BitmapFactory.decodeStream(s)); //gives an OutOfMemoryError if png > ~30KB 
        return d; 

       } catch (OutOfMemoryError ex) { 

        Toast.makeText(this, "An OutOfMemoryError occured and" + 
          " the image was loaded at a lower quality.", Toast.LENGTH_SHORT).show(); 
        BitmapFactory.Options mOptions = new BitmapFactory.Options(); 
        mOptions.inSampleSize = 4; 
        BitmapDrawable d = new BitmapDrawable(getResources(), 
          BitmapFactory.decodeStream(s, null, mOptions)); 
        return d; 

       } 

      } 
      else return null; 

     } 
     catch (Exception ex) { 
      return null; 

     } 

    } 
    else { 
     Toast.makeText(this, "External storage not available. Downloading from internet.", 
       Toast.LENGTH_SHORT).show(); 
     return null; 
    } 

} 

回答

0

从服务器上下载的图片是每个字节进行字节,并且不能进行双级神奇......

+0

这是我的想法很明显。难道它没有正确地将它重新压缩为PNG? – 2010-10-10 22:59:44

+0

查看此链接:http://developer.android.com/guide/appendix/media-formats.html – fedj 2010-10-11 09:53:08