有2个班级; MainActivity
和SimpleFLashLighImpl
。
在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的延迟。
解决方案可以是什么?
答案 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!!!");
}
}