【问题标题】:Accessing a variable from different classes从不同的类访问变量
【发布时间】:2016-08-21 11:04:30
【问题描述】:

有 2 个类; MainActivitySimpleFLashLighImpl。 在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);
}

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

【问题讨论】:

  • 没有改变类变量intdelay的语句,所以它始终保持在初始值1000。也许int intdelay = Integer.parseInt(no)语句是为了改变它,但是它引入了一个块本地变量,而不是保持类变量不变。但是,即使您删除类型声明,它也可能不会执行您想要的操作,因为该操作似乎发生在按钮的 onClick 方法中,您再次没有触及类变量。

标签: java android class


【解决方案1】:

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

【讨论】:

  • 这个问题解决了吗?然后请将其标记为已解决。
【解决方案2】:

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

int intdelay = Integer.parseInt(no);

应该是

MainActivity.intdelay = Integer.parseInt(no);

一旦你解决了这个问题,你就会遇到内存可见性问题。除非您使用某种形式的同步,否则不能保证一个线程所做的更改对其他线程可见。

我建议将intdelay 变量标记为volatile

public static volatile int intdelay = 1000;

【讨论】:

  • @Aloweiwi 你能用更新的代码更新你的问题吗?
  • 好的,看起来不错,应该可以了。您能否检查是否正在调用以下代码并且您的文本输入是否正在更新 intdelayMainActivity.intdelay = Integer.parseInt(no);
  • 如何检查?
  • 我不太了解android,但是你应该可以在这个语句之前和之后记录一条消息:MainActivity.intdelay = Integer.parseInt(no);,然后使用adb logcat查看输出?还要记录您从编辑框中获得的no 的值。
【解决方案3】:

您的代码可能会抛出异常并进入 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();
    }

【讨论】:

  • 然后将 getContext() 替换为您的活动名称,例如 MainActivity().this
  • 它会导致应用在启动前崩溃
  • 重新复制代码并检查'no'的值,你得到的是字符串还是整数甚至长类型?
【解决方案4】:

为什么不声明可运行延迟?

看到我的回答是关于可运行的后循环

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

 }

然后使用:

A 类

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

B 类

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

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2021-02-19
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多