访问函数外部的全局值



>我正在尝试在函数中设置一个值(全局),并在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
}        
};
}

只需将变量初始化为类中的公共静态gobally。您将能够从任何地方访问它。

将变量定义为公共static

public class TryActivity extends Activity
{ 
public static  double BAT;  //global value.
public void onCreate(Bundle savedInstanceState) {
...
...
...

您获得的值为0.0BAT,因为当您的活动开始时,执行方法onCreate()和方法disp(),该方法仅注册获取电池电量的 Intent。

如果您想在活动开始时获取电池电量,您可以使用一个功能来获取电池电量而不会收到更新。

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.

问题是你不理解并发的概念。不会立即调用广播接收器的onReceive()。因此,您只是在disp()中设置广播接收器,而不是直接接触BATBAT只有在调用onReceive()时才会填充正确的值。

如果您查看日志,则在 BroadcastReceiveronReceive编写的System.out.println()之前,也会调用您用onCreate编写的System.out.println(),即使它是在disp()方法之后编写的。

原因:

disp()方法中,您只是注册了BroadcastRecever并不意味着调用了BroadcastReceiver。它将在电池电量更改后的某个时间后调用。

溶液:

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

doThings(double batteryLevele){
//write whatever you want to do with BAT
}

并从广播接收器的onReceive方法调用此函数。

相关内容

  • 没有找到相关文章