2016-08-21 4 views
2

есть 2 класса; MainActivity и SimpleFLashLighImpl. В классе MainActivity я поместил код, чтобы получить строку из поля ввода «нет» , а затем преобразовать ее в целое число «intdelay». Это MainActivity часть кода:Доступ к переменной из разных классов

public static volatile int intdelay = 1000; 






    textView=(TextView)findViewById(R.id.textView); 
    delay=(EditText)findViewById(R.id.edttxt); 

    String no=delay.getText().toString();  //this will get a string 
    try{ 
     MainActivity.intdelay = Integer.parseInt(no); 
    }catch(NumberFormatException ex){ // handle your exception 
    } 

    Button btn=(Button)findViewById(R.id.btn); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      textView.setText(delay.getText()); 
     } 
    }); 

в другом классе я пытаюсь получить доступ к «intdelay» INT значение, чтобы сделать задержку с помощью обработчика. Это другой класс часть кода:

public void switchFlash() { 
     final Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
      if (isFlashOn()) { 
       turnOffFlash(); 
       x++;  
      } else if (x>10) { 
       turnOffFlash(); 
      } 
      else 
      { 
       turnOnFlash(); 
      } 
      handler.postDelayed(this, MainActivity.intdelay); 

      } 
     }; 
    handler.postDelayed(runnable,MainActivity.intdelay); 
} 

Но проблема в том, что каждый раз, когда я получаю задержку 1000, который инициализируется в начале MainActivity класса. Каким может быть решение?

+1

Нет инструкции, которая изменяет переменную класса 'intdelay', поэтому она всегда остается на начальном значении 1000. Может быть, выражение' int intdelay = Integer.parseInt (no) 'предназначено для его изменения, но оно вводит локальная переменная блока вместо этого, которая оставляет переменную класса нетронутой. Но даже если вы удалите объявление типа, оно может не делать то, что вы хотите, потому что действие, похоже, происходит в методе 'onClick' кнопки, где вы снова не касаетесь переменной класса. – Seelenvirtuose

+0

Любое предложение? – Aloweiwi

ответ

0

Вы создаете новую переменную intdelay, вместо изменения статической переменной заявил:

int intdelay = Integer.parseInt(no); 

должен быть

MainActivity.intdelay = Integer.parseInt(no); 

После того, как вы исправить это, вы столкнетесь с проблемами видимости памяти. Изменения, внесенные одним потоком, не гарантируются для других потоков, если вы не используете какую-либо форму синхронизации.

Я хотел бы предложить маркировка intdelay переменной в volatile:

public static volatile int intdelay = 1000; 
+0

Я пробовал, но не изменил результат – Aloweiwi

+0

@Aloweiwi можете ли вы обновить свой вопрос с помощью обновленного кода? – rohitvats

+0

Обновлено ........ – Aloweiwi

0

Это возможно, ваш код бросает исключение и собирается в поймать заявление, поэтому значение по умолчанию все равно будет тот же, который 1000. Проверьте ваш

int intdelay = Integer.parseInt(no); 

использовать logd/toast, чтобы проверить, какое значение вы пытаетесь проанализировать. Как это , если в классе активности

try{ 
     int intdelay = Integer.parseInt(no); 
    }catch(NumberFormatException ex){ // handle your exception 
     Toast.makeText(MainActivity.this(),"no is: "+ no,Toast.LENGTH_SHORT).show(); 
    } 
+0

Не удается разрешить символ 'getContext' – Aloweiwi

+0

, а затем замените getContext() своим именем вашей деятельности следующим образом: MainActivity(). – Vaygeth

+0

Это приводит к сбою приложения перед запуском – Aloweiwi

0

почему у не объявлять задержку в работоспособном?

видеть мой ответ говорит о работоспособной после цикла

What will happen if I use try catch and finally for handler using runnable?

пример:

final Handler handler = new Handler(); 
    handler.post(new Runnable() { 

    // this int will also be passed to method post delayed 
    // as "this" keyword applies to Anonymous Class 
    // which body contains everything between brackets of new Runnable() { ... } 
    int withThisDelay = 1000; 

    @Override 
    public void run() { 
     handler.postDelayed(this,withThisDelay); 
     withThisDelay += 1000; 
    } 
}); 

можно расширить (реализовать) работоспособным в собственном классе (реферат без пробега) (с геттер/setter), а затем определить эту переменную как переменную и использовать ее

public abstract class MyIntRunnable implements Runnable { 

     int _myDelay = 1000; 
     // to get delay 
     public int getDelay() { return _myDelay; } 
     // to set delay 
     public void setDelay(int myDelay) { _myDelay = myDelay; } 

} 

затем использовать:

ClassA

private final static MyRunnable myRunnable = new MyRunnable() { 

     @Override 
     public void run() { 

      // post with var delayed 
      Handler.postDelayed(this,getDelay()) 

     } 
} 
// get delay from runnable 
myRunnable.setDelay(2000); 
// set delay to runnable 
int myDelayFromRunnable = myDelay.getDelay(); 

ClassB

btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // get string from edit text 
     String getDelayString = delay.getText(); 
     // prevent null values or empty string 
     // you should use catch numberformat exception here 
     // this mean check if text is not null and is not empty 
     // if empty or null set to 1000 else try parse to int 
     int delay = getDelayString != null && !getDelayString.isEmpty() 
         ? Integer.parseImnt(getDelayString) : 1000; 
     // set delay in static runnable in other class 
     ClassA.myRunnable.setDelay(delay); 
    } 
}); 

Пример использования улов NumberFormatException

EditText editText = (EditText) findViewById(.....); 

// we can define this as method and use in on click listener 
private void myParseMethod(EditText editText) { 
    try { 
     String stringDelay = editText.getText().toString(); 
     // if parsing was successful 
     ClassA.myRunnable.setDelay(stringDelay);; 
    } catch (NumberFormatException nxe) { 
     // inform user 
     editText.setError("Bad integer!!!"); 
    } 
} 
+0

Мне нужно получить значение задержки из editbox – Aloweiwi

+0

@Aloweiwi см. Редактировать – ceph3us

1

Вы никогда не меняете значение intdelay. MainActivity.intdelay = Integer.parseInt(no); делает сравнение, не изменение. Используйте ==, чтобы установить новое значение. Вы также должны объявлять свои переменные private и создавать методы getter/setter. Вы также должны подумать о переносе переменных задержки в свой Runnable, если это не требуется в другом месте.

+0

Решен ли этот вопрос? Тогда отметьте его как решенный пожалуйста. –