Android:声明静态位图? 是还是不是?
最近有人对我的代码发表了评论,声明了以下内容:
private Bitmap splashBackground;
private Bitmap lightDot;
private static Bitmap scaledBackground;
private static Bitmap scaledLightDot;
他们建议我不要声明satic Bitmaps。
但是,我试过所有的东西,除非我声明它们是静态的,否则我的代码不起作用。
此外,“公共静态位图createScaledBitmap(位图src,int dstWidth,int dstHeight,布尔过滤器)”似乎出现在官方的Android开发者网站上,所以我对我应该做什么和不应该做什么感到困惑。
任何指针将不胜感激 - 谢谢
编辑:澄清:
当我从我的声明中移除静态的时候,到了我的onDraw()方法时,缩放后的位图为空。 (我在initialise()方法中创建缩放的位图对象,一旦创建它,它就是有效的(即非空) - 但是,除非我声明它为静态,否则在onDraw中似乎变为null。
我从我的activity类调用了我的initialise()方法。
编辑:更多的代码按要求。
我的OnCreate方法:正如你所看到的,我通过我的屏幕高度和宽度,所以我可以创建我的缩放位图
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
displaySplashScreen= new SplashScreen(this);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// set View
setContentView(new SplashScreen(this));
WindowManager w = getWindowManager();
Display d = w.getDefaultDisplay();
int width=d.getWidth();
int height=d.getHeight();
displaySplashScreen.initialise(width, height);
}
我的初始方法:
public void initialise(int w, int h)
{
//Get width and height (passed in from Activity)
vwidth=w;
vheight=h;
//Create pre-scaled bitmaps
scaledBackground = Bitmap.createScaledBitmap(splashBackground, vwidth, vheight, true);
scaledLightDot = Bitmap.createScaledBitmap(lightDot, vwidth, vheight, true);
}
我还可以补充说,如果我以同样的方式使用一个标准变量(比如说int数;)并将它设置为initalise(number = 5;),那么在我的初始化方法中数字只等于5。 如果我从onDraw()记录它,它总是会重复返回'0'! 真是莫名其妙。
感谢所有人,请让我知道是否需要更多代码......
一般来说,对Bitmap
使用static
是一个非常糟糕的主意。 这有很多很好的理由,主要是避免内存泄漏。
此外,“公共静态位图createScaledBitmap(位图src,int dstWidth,int dstHeight,布尔过滤器)”似乎出现在官方Android开发人员网站上...
这不是一个static Bitmap
。 这是一个调用类方法的方法。 静态工作不一样,返回类型( Bitmap
)不是静态的。 这意味着该方法是静态的,不需要调用实例。 它将返回一个位图,放置在您选择的适当变量中。
我从我的activity类调用了我的initialise()
方法。
这种说法是相当无益的。 从班上哪里来的? 它是在onCreate()
, onStart()
, onResume()
,一些其他的自定义方法吗? 何时何地选择做某些事情会对他们的成功产生巨大影响。
......但是,除非我声明它是静态的,否则在onDraw中似乎变为空。
这可能是由于几种可能的原因,并且由于我们没有任何代码,因此实际上没有合格的答案。 这里有一些事情要看。
null
。 createScaledBitmap()
方法。 编辑:审查你的代码后
这看起来可能是罪魁祸首。 以上,你有...
displaySplashScreen= new SplashScreen(this);
在下面,你添加...
setContentView(new SplashScreen(this));
这意味着您正在创建两个 Splashscreens。 当你不使用static
时你得到一个空指针的原因之一可能是因为你使用的线路更远......
displaySplashScreen.initialise(width, height);
但是由于你的contentView被设置为一个新的 SplashScreen,你实际上并没有使用该视图。 要解决此问题,请确保您正在与同一视图对象通话。 IE
setContentView(displaySplashScreen);
这至少会确保你正在看同一个对象。 根据其他事情的发生,您可能需要重新组织一下。 例如,
setContentView(displaySplashScreen);
...可能不得不出现在...下面
displaySplashScreen.initialise(width, height);
这是你可能需要玩弄的东西,但我没有看到其他任何可以给出任何其他直接指示的东西。 请注意,首先解决nullpointerexceptions通常会导致代码中出现更多错误。 坚持课程并按顺序解决。
这条线是错误的:
// set View
setContentView(new SplashScreen(this)); // This line is wrong.
应该是这样的:
// set View
setContentView(displaySplashScreen); // displaySplashScreen is created earlier.
您创建了两个SplashScreen
实例。 你应该继续使用相同的实例。
我投票赞成,这是一个静态变量
private Bitmap splashBackground;
private Bitmap lightDot;
private static Bitmap scaledBackground;
private static Bitmap scaledLightDot;
这是一个静态的方法
public static Bitmap createScaledBitmap (Bitmap src,
int dstWidth, int dstHeight, boolean filter)
如果你有一个类,静态变量通常被声明为一个常量,变量属于类而不是对象
public class car {
private static colorOfCar;
private numberOfDoor;
}
假设你有一辆汽车,并且在你创建一个汽车级别的保时捷和法拉利时有两个变量colorOfCar和numberOfDoor,如果你改变了门的数量,那么保时捷对象和法拉利对象中的numberOfDoor会不同,但是如果你更改colorOfCar保时捷对象和法拉利对象colorOfCar都将被更改,因为colorOfCar是属于类而不是对象的静态对象。
我希望你能理解我的解释。 如果您发现我的答案帮助您,请投票并接受我的答案,如果您有任何其他问题请随时在评论中提问,谢谢:)
链接地址: http://www.djcxy.com/p/93053.html