>我正在尝试在函数中设置一个值(全局),并在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.0
的BAT
,因为当您的活动开始时,执行方法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()
中设置广播接收器,而不是直接接触BAT
。BAT
只有在调用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
方法调用此函数。