2012-09-22 171 views
0

我试图让我的程序使用更少的资源,当我通过覆盖onClose()函数将其发送到背景时。我的第一步是停止绘制文本和计量字段。isForeground()和onExposed和onObscured之间的区别

我一直在阅读效率这个文档, "Eliminating unnecessary processing on the device"

“可以使用的方法来停止动画或重绘屏幕时,屏幕是不可见的,并且当屏幕再次显示恢复。您可以覆盖Screen.onExposed(),当您的应用程序的屏幕位于显示堆栈顶部并显示给用户时,可以调用该屏幕。您可以覆盖Screen.onObscured(),当您的应用程序屏幕未显示给用户或被另一个屏幕遮挡。“

我知道如果我使用isForeground(),它会从绘画,如果我的应用程序在后台阻止它,但它会做同样的,如果它是由另一个应用程序掩盖?它似乎更容易使用isForeground()

private boolean isExposed; 

protected void onExposed() 
{ 
    isExposed = true; 
} 
protected void onObscured() 
{ 
    isExposed = false; 
} 

public void batteryStatusChange(int status) 
{ 
    // TODO Auto-generated method stub 
    if ((status & DeviceInfo.BSTAT_LEVEL_CHANGED) != 0) 
    { 
//is there a difference between the two if's? 

     //if(isExposed)  
     //if(UiApplication.getUiApplication().isForeground()) 

     { 
     batteryStatusField.setText(getBatteryLevel()); 
     bitGauge6.setValue(DeviceInfo.getBatteryLevel()); 
     }  


    } 
} 
    public boolean onClose() 
{ 
    UiApplication.getUiApplication().requestBackground(); 
    return true; 
} 
+2

是否设置文本字段的文本和计量器字段的级别**所有**在您的'batteryStatusChange'回调被调用时发生?如果是这样,我认为你不需要担心资源使用。 – Nate

回答

3

一般来说,isForeground()告诉你,如果你的应用程序在前台运行。但是,正如你已经实现的那样,isExposed变量只会告诉你它所属的屏幕已经被暴露或者被遮挡(因为你将它设置在Screen.onExposed()Screen.onObscured()方法中)。

对于你的应用程序,也许你只有一个Screen子类?

大多数应用程序将有许多屏幕。因此,在这种情况下,isExposed变量只会告诉您是否显示一个(很多)屏幕。

如果你的应用只有一个Screen,那么任何一种技术都应该适合你。

然而,正如我在我的评论说,如果你已经发布的代码表明所有,你在batteryStatusChange()回调做的话,我不认为你真的需要担心性能。在移动设备上体验性能是一件好事,但您在该方法中所做的任何UI调用都不会导致任何显着的性能成本。

batteryStatusField.setText(getBatteryLevel()); 
    bitGauge6.setValue(DeviceInfo.getBatteryLevel()); 
+0

谢谢,现在我不会使用它们。 – Dog