Utility类中的静态字段

时间:2018-01-22 14:09:17

标签: java android

人们!我是Android开发和开发中的新手。 我在应用程序上工作,应显示舍入的位图。我创建了一个如下所示的实用程序类:

public class PictureClipper {

    private static Bitmap before;
    private static Bitmap after;
    private static RoundedBitmapDrawable img;

    public static RoundedBitmapDrawable makeItRound (String baseImage, Resources resources){
        byte[] imageBytes = Base64.decode(baseImage.getBytes(), Base64.DEFAULT);
        before = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
        if (before.getWidth() >= before.getHeight()){
            after = Bitmap.createBitmap(
                    before,
                    before.getWidth()/2 - before.getHeight()/2,
                    0,
                    before.getHeight(),
                    before.getHeight()
            );
        }else{
            after = Bitmap.createBitmap(
                    before,
                    0,
                    before.getHeight()/2 - before.getWidth()/2,
                    before.getWidth(),
                    before.getWidth()
            );
        }
        img = RoundedBitmapDrawableFactory.create(resources, after);
        img.setCircular(true);
        return img;
    }
}

我认为通过不在方法中创建新对象并重用类字段,我可能会优化一下。 但最近我开始阅读开源代码(为了提高自己)并且惊讶地发现几乎完全相同的实现,但是对象是在方法内部创建的。该应用程序名为LeafPic,代码如下:

public class BitmapUtils {
    public static Bitmap addWhiteBorder(Bitmap bmp, int borderSize) {
        Bitmap bmpWithBorder = Bitmap.createBitmap(bmp.getWidth() + borderSize * 2, bmp.getHeight() + borderSize * 2, bmp.getConfig());
        Canvas canvas = new Canvas(bmpWithBorder);
        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(bmp, borderSize, borderSize, null);
        return bmpWithBorder;
    }

    public static Bitmap getCroppedBitmap(Bitmap srcBmp){
        Bitmap dstBmp;
        if (srcBmp.getWidth() >= srcBmp.getHeight()){
            dstBmp = Bitmap.createBitmap(srcBmp,
                    srcBmp.getWidth()/2 - srcBmp.getHeight()/2, 0,
                    srcBmp.getHeight(), srcBmp.getHeight()
            );
        } else {
            dstBmp = Bitmap.createBitmap(srcBmp, 0,
                    srcBmp.getHeight()/2 - srcBmp.getWidth()/2,
                    srcBmp.getWidth(), srcBmp.getWidth()
            );
        }
        return dstBmp;
    }
}

可悲的是,我不清楚是否存在任何差异,如果存在差异,如何衡量它。任何人都可以为我清除它吗?

1 个答案:

答案 0 :(得分:1)

最大的区别在于:使用静态字段的代码不是线程安全的。一旦你有更多而不是一个线程调用makeItRound(),多个线程开始覆盖静态字段before和{{1} }。

第二段代码有问题。

换句话说:您可以根据需要并行调用静态方法 - 但只要这些方法在共享数据上运行,您的代码就会受到影响多线程问题。通过使用恰好发生的静态字段。