1

Ich versuche, den Akkustand von einem Dienst zu erhalten. Ich werde erfolgreich Level. Aber ich habe ein Problem. Und das ist , wenn ich versuche, zum ersten Mal den Akkustand zu bekommen, dann bekomme ichnull. Aber wenn ich nach ein paar Sekunden später frage, dann bekomme ich genaues Niveau. Ich verstehe nicht, warum das passiert.Android - Ermitteln des Akkuladestands bei der ersten Anfrage

Hier ist mein Code Ladezustand der Batterie zu erhalten: -

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; 
    } 

den Code Bitte beachten Sie. Ich weiß nicht, warum ich null als mein Batterie-Level bekomme, wenn ich zum ersten Mal frage. Bitte helfen

+1

Ich würde empfehlen, einen BroadcastReceiver nicht in eine Methode zu packen. – Distjubo

+0

Oder MINDESTENS unregistrieren ... – Distjubo

Antwort

0

Soweit ich lesen kann. Sie führen Ihren Code linear und

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

Dieser String ist null, dann einen nicht initialisierten Wert zurückgibt, können Sie den Empfänger registrieren. Sobald dieses Ereignis gesendet wird, ändern Sie Ihre Variable und es hat die richtigen Informationen.

Dies bricht OO Paradigma.

+0

Sorry, ich verstehe nicht, was Sie zu sagen versuchen. Hier, ** bLevel ** ist eine globale Variable und sollte ich es nun zur inneren Variable machen? –

+0

Nein. Sie machen ein Programm, das in einem objektorientierten System "prozedural" ist. Sie brechen das Paradigma ... Denken Sie daran, Sie haben 1 'Pointer', um die Ausführung zu programmieren. es führt seine gesamte Codeliste aus und führt 1 nach 1 aus ... und du registrierst deine Sendung, um das NEXT-Ereignis in Bezug auf den Batterielevel zu empfangen .... lass uns sagen, dass es in 10 Sekunden geschehen wird ... was hast du dabei? variabel bis diese Sekunden vergehen? 'null'. – Bonatti

+0

Was soll ich jetzt tun? –