Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android png下载大小与服务器大小不同?_Android_Png_Out Of Memory_Fileoutputstream - Fatal编程技术网

Android png下载大小与服务器大小不同?

Android png下载大小与服务器大小不同?,android,png,out-of-memory,fileoutputstream,Android,Png,Out Of Memory,Fileoutputstream,我的应用程序将.png文件下载到sd卡以供以后使用。我一直在摆脱记忆错误,若有人能解释一下,那个就太好了!所以我查看了保存到sd卡上的图像的大小,它们似乎是服务器上图像大小的两倍。为什么会这样?我怎样才能使它们变小 public void onCreate(Bundle saved) { setContentView(R.layout.namedrxnscreen); TextView t1 = (TextView)findViewById(R.id.rxn_text1);

我的应用程序将.png文件下载到sd卡以供以后使用。我一直在摆脱记忆错误,若有人能解释一下,那个就太好了!所以我查看了保存到sd卡上的图像的大小,它们似乎是服务器上图像大小的两倍。为什么会这样?我怎样才能使它们变小

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;
    }

}

从服务器下载的图片是逐字节完成的,不能神奇地加倍大小…

这显然是我的想法。可能是它没有正确地将其重新压缩为png吗?