人们!我是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;
}
}
可悲的是,我不清楚是否存在任何差异,如果存在差异,如何衡量它。任何人都可以为我清除它吗?
答案 0 :(得分:1)
最大的区别在于:使用静态字段的代码不是线程安全的。一旦你有更多而不是一个线程调用makeItRound()
,多个线程开始覆盖静态字段before
和{{1} }。
第二段代码不有问题。
换句话说:您可以根据需要并行调用静态方法 - 但只要这些方法在共享数据上运行,您的代码就会受到影响多线程问题。通过使用恰好发生的静态字段。