Доступ к глобальному значению вне функции

Я пытаюсь установить значение (глобальное) в функции и получить к нему доступ вне функции, которая находится в «При создании ()» в Android. Я пытался сделать глобальную переменную статической и даже пытался записать ее в « редактировать текст» и анализировать его в «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
        }        
    };
}

person Ak-    schedule 31.01.2014    source источник
comment
OnCreate — это первое, что запускается, поэтому, если вы не вызовете функцию в методе OnCreate перед ссылкой на переменную, она будет иметь значение 0,0 (значение по умолчанию). Может быть, опубликуйте какой-нибудь код, чтобы я мог точно видеть, что происходит и что вам нужно?   -  person ArmaAK    schedule 31.01.2014
comment
Пожалуйста, опубликуйте свой код. Ваше объяснение немного усложняет.   -  person FD_    schedule 31.01.2014
comment
and I even tried to write it in a "edit text" and parsing it in "on create()" ...звучит как логическая проблема...   -  person FD_    schedule 31.01.2014
comment
@FD_ серьезно, я прочитал это три раза, но ничего не понял. Ak-нет необходимости определять общедоступные и статические объекты, если вы хотите получить доступ к тому же классу, в вашей логике что-то не так. Как было предложено, пожалуйста, включите свой код для того же самого.   -  person pyus13    schedule 31.01.2014
comment
спасибо за ответ, ребята, извините за ясность в вопросе :( Я новичок в Android и STACKOVERFLOW s....   -  person Ak-    schedule 31.01.2014


Ответы (4)


Просто инициализируйте переменную как public static глобально в классе. Вы сможете получить к нему доступ из любого места.

person fida1989    schedule 31.01.2014
comment
Я пытался сделать это, но даже если это GLOBAL (переменная BAT), он возвращается к BAT = 0,0; даже после вызова disp(); который изменяет значение BAT. - person Ak-; 31.01.2014
comment
Вы не можете иметь глобальную переменную в Activity. По определению глобальное значение имеет время существования и область действия, равные сроку действия приложения. Вы говорите о поле класса. - person Simon; 31.01.2014

Определите общедоступные 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.
person Jorgesys    schedule 31.01.2014
comment
Я не считаю, что это проблема доступа к значениям из разных классов, а скорее к различным функциям в одном классе, а именно к методу OnCreate() и его пользовательской функции. - person ArmaAK; 31.01.2014
comment
спасибо, меня неправильно поняли, я отредактировал свой ответ - person Jorgesys; 31.01.2014
comment
Я попытался сделать его статическим, по-видимому, когда я обращаюсь к значению BAT в onCreate(), он дает 0,0 перед отображением BAT, который я вызвал функцией disp(); который изменяет значение BAT (но значение BAT не изменяется вне disp(); ), и если мы попытаемся сделать его членом финального класса, в финале мы не сможем изменить элементы данных. Поэтому я не могу установить значение BAT, если оно окончательное - person Ak-; 31.01.2014

Проблема в том, что вы не понимаете концепцию параллелизма. onReceive() BroadcastReceiver не будет вызываться немедленно. Таким образом, вы просто настраиваете BroadcastReceiver в disp() и не касаетесь напрямую BAT. BAT будет заполнено правильным значением только при вызове onReceive().

person FD_    schedule 31.01.2014

Если вы заглянете в свои журналы, то System.out.println(), которое вы записали в onCreate, будет вызываться перед System.out.println(), записанным в onReceive вашего BroadcastReceiver, даже если оно написано после вашего метода disp().

Причина:

В методе disp() вы просто регистрируете свой BroadcastReceiver, это не означает, что ваш BroadcastReceiver вызывается. Он будет вызван через некоторое время, когда уровень заряда батареи изменится.

Решение:

Если вы хотите что-то сделать со своей переменной BAT, определите функцию в своем классе Activity и напишите внутри нее всю логику, например

doThings(double batteryLevele){

    //write whatever you want to do with BAT

}

и вызовите эту функцию из метода onReceive вашего BroadcastReceiver.

person pyus13    schedule 31.01.2014
comment
так что я не могу получить доступ к значению BAT в onCreate ()? PS: я попробовал функцию BATsetter(двойной уровень){BAT=level;} в BroadCastReciever(); но значение BAT по-прежнему равно 0,0 в другой функции (не onCreate()). - person Ak-; 01.02.2014
comment
нет, потому что onCreate будет вызываться один раз, и вещание не будет вызываться в это время, но вы хотите получить к нему доступ в onCreate(), только вы можете делать все, что хотите, в методе и вызывать его из своего BroadcastReceiver . - person pyus13; 01.02.2014