【问题标题】:Android - Getting battery level null when first time askAndroid - 第一次询问时电池电量为空
【发布时间】:2016-03-30 11:33:16
【问题描述】:

我正在尝试通过服务获取电池电量。我成功升级了。但我有一个问题。这就是当我第一次尝试获取电池电量时,我得到 null但是当我在几秒钟后询问时,我得到了准确的水平。我不明白为什么会发生这种情况。

这是我获取电池电量的代码:-

String bLevel;
private String getBatteryLevel(){
        BroadcastReceiver cBReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                context.unregisterReceiver(this);
                int currentLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                int currentScale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                int batteryLevel;
                if (currentLevel >= 0 && currentScale > 0) {
                    batteryLevel = (currentLevel * 100) / currentScale;
                    bLevel = Integer.toString(batteryLevel) + " percent";
                }
            }
        };
        IntentFilter cIFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(cBReceiver, cIFilter);
        return bLevel;
    }

请查看代码。我不知道为什么当我第一次询问时,我的电池电量为 null。请帮忙

【问题讨论】:

  • 我建议不要将 BroadcastReceiver 打包到方法中。
  • 或者至少取消注册...

标签: java android intentfilter batterylevel android-broadcastreceiver


【解决方案1】:

据我所知。您正在线性运行代码,并返回一个未初始化的值

String bLevel;
// stuffs ... stuffs ... stuffs...
return bLevel;

此字符串为空,那么,您正在注册接收者。广播该事件后,您可以更改变量,它具有正确的信息。

这打破了 OO 范式。

【讨论】:

  • 对不起,我不明白你想说什么。在这里,bLevel 是一个全局变量,现在我应该将其设为内部变量吗?
  • 没有。您正在面向对象的系统中制作“程序化”程序。你打破了范式......这样想,你有 1 个Pointer 来执行代码。它运行它的整个代码列表,一个接一个地执行......并且您注册广播以接收与电池电量相关的 NEXT 事件......假设它会在 10 秒内发生......你有什么变量直到那些秒过去? null.
  • 我现在该怎么办?
  • @MuhammadJobayer 该方法必须等待 BroadcastReceiver
  • @MuhammadJobayer 你应该先了解Threads,然后做一个小if(bLevel!=null){return bLevel;} else {return "Gathering data";}
猜你喜欢
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多