访问不同类的变量

时间:2016-08-21 11:04:31

标签: java android class

有2个班级; MainActivitySimpleFLashLighImpl。 在MainActivity课程中,我添加了一个代码,用于从编辑框中获取字符串“不”#39} 然后将其转换为整数' 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);
}

但问题是每次我得到在MainActivity课程开始时初始化的1000的延迟。 解决方案可以是什么?

4 个答案:

答案 0 :(得分:1)

您永远不会更改intdelay的值。 MainActivity.intdelay = Integer.parseInt(no);确实比较,而不是改变。使用==设置新值。 您还应该将变量声明为private并构建getter / setter方法。 如果其他地方不需要,您还应该考虑将延迟变量移动到Runnable中。

答案 1 :(得分:0)

您正在创建一个新的intdelay变量,而不是修改声明的静态变量:

int intdelay = Integer.parseInt(no);

应该是

MainActivity.intdelay = Integer.parseInt(no);

修复后,您将遇到内存可见性问题。除非您使用某种形式的同步,否则不保证一个线程所做的更改对其他线程可见。

我建议将intdelay变量标记为volatile

public static volatile int intdelay = 1000;

答案 2 :(得分:0)

您的代码可能会抛出异常并进入catch语句,因此默认值仍然是1000.检查您的

int intdelay = Integer.parseInt(no);

使用logd / toast来检查您要解析的值。像这样 如果在Activity类

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

答案 3 :(得分:0)

为什么你不在runnable中声明延迟?

看我的回答是关于runnable post loop

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

你可以扩展(实现)runnable作为自己的类(抽象而不运行)(使用getter / setter),然后将此runnable定义为变量并使用它

 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的catch

    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!!!");
    }
}