访问函数外的全局值

时间:2014-01-31 18:50:37

标签: android function global-variables oncreate

我正在尝试在函数中设置一个值(全局)并在android中的“On create()”中的函数外部访问它 我已经尝试将全局变量设置为静态,我甚至尝试在“编辑文本”中编写它并在“on create()”中解析它。但它保持初始化为0.0(变量是双重类型) 当我试图访问“on create()”时,

哦,我无法返回该值,因为该函数太嵌套,因此所有层次结构都太复杂了。 :(

任何人都可以帮助我;

    public class TryActivity extends Activity
    {
        double BAT;\\ global value
     public void onCreate(Bundle savedInstanceState)
            {      
        disp(); // calling the function disp to set the value to BAT                
        String To_string=Double.toString(BAT);    
            System.out.println("Current Battery level  ==="+To_string); \\ prints 0.0 the wrong value
        super.onCreate(savedInstanceState);
            setContentView(R.layout.main); 
           }


     public void disp(){            
        this.registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));               
        }



        private BroadcastReceiver batteryInfoReceiver = new BroadcastReceiver(){                
        public void onReceive(Context context, Intent intent){                  
        double  level= intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
        BAT=level;
            Textview1 = (EditText) findViewById(R.id.Textview1);
            Textview1.setText(Double.toString(BAT));      // sets the correct value
            System.out.println("bbbattererrerey 1 "+Double.toString(BAT));   //prints the correct value
        }        
    };
}

4 个答案:

答案 0 :(得分:1)

只需在类中全局初始化变量为 public static 。您可以从任何地方访问它。

答案 1 :(得分:1)

将您的变量定义为公共 static

public class TryActivity extends Activity
{ 
public static  double BAT;  //global value.

public void onCreate(Bundle savedInstanceState) {
...
...
...

您的BAT值为0.0,因为当您的活动开始时执行方法onCreate()以及仅注册意图获取电池的方法disp()水平。

如果您想在活动开始时获得电池电量,您可以通过一项功能来获取电池电量而无需接收更新。

public float getMyBatteryLevel() {
        Intent batteryIntent = this.getApplicationContext().registerReceiver(null,
        new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        return batteryIntent.getIntExtra("level", -1);
}

@Override
protected void onCreate(Bundle savedInstanceState) {        
    //* Add this method.   
    getMyBatteryLevel()

    disp(); // calling the function disp to set the value to BAT                
    String To_string = Double.toString(BAT);    
    System.out.println("Current Battery level  ==="+To_string); //prints the right battery level.

答案 2 :(得分:0)

问题是你不了解并发的概念。不会立即调用BroadcastReceiver的onReceive()。因此,您只需在disp()中设置BroadcastReceiver,而不是直接触摸BAT。 <{1}}只会在调用BAT时填入正确的值。

答案 3 :(得分:0)

如果您查看日志,System.out.println()中写的onCreate将在您的BroadcastReceiver的System.out.println()中写的onReceive之前被调用,即使它已被写入在disp()方法之后。

原因:

disp()方法中,您只是注册BroadcastRecever并不意味着您的BroadcastReceiver被调用。在您的电池电量发生变化后,它会被调用。

解决方案:

如果你想用you BAT变量做一些事情,在Activity类中定义一个函数,并在其中写入整个逻辑,如

doThings(double batteryLevele){

    //write whatever you want to do with BAT

}

并从BroadcastReceiver的onReceive方法调用此函数。