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()方法。
  • 由于内存不足,Bitmap可能会被回收(实际上,这比其他人想象的要多)
  • 编辑:审查你的代码后

    这看起来可能是罪魁祸首。 以上,你有...

    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

    上一篇: Android: Declaring static bitmaps? Yay or nay?

    下一篇: What does setFilterMap on android do?