2016-08-21 5 views
2

gibt es 2 Klassen; die MainActivity und SimpleFLashLighImpl. In MainActivity Klasse habe ich einen Code, um eine Zeichenfolge aus einem Bearbeitungsfeld 'no' und dann konvertieren es in eine ganze Zahl 'intdelay'. Dies ist MainActivity Teil des Codes:Zugriff auf eine Variable aus verschiedenen Klassen

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

in der anderen Klasse I den ‚IntDelay‘ int Wert zuzugreifen versuchen eine Verzögerung mit Handler zu machen. Das ist die andere Klasse Teil des Codes:

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

Aber das Problem ist, dass jedes Mal, wenn ich die Verzögerung von 1000 bin immer, die zu Beginn der MainActivity Klasse initialisiert wird. Was könnte die Lösung sein?

+1

Es gibt keine Anweisung, die die Klassenvariable 'intdelay' ändert, so dass sie immer auf dem Anfangswert von 1000 bleibt. Vielleicht sollte die Anweisung' int intdelay = Integer.parseInt (no) 'dies ändern, aber es wird eingeführt stattdessen eine lokale Blockvariable, die die Klassenvariable unberührt lässt. Aber selbst wenn Sie die Typdeklaration entfernen, wird es möglicherweise nicht das tun, was Sie wollen, weil die Aktion scheinbar in der Methode 'onClick' der Schaltfläche stattfindet, in der Sie die Klassenvariable nicht erneut berühren. – Seelenvirtuose

+0

Irgendwelche Vorschläge? – Aloweiwi

Antwort

0

Sie sind eine neue intdelay Variable erstellen, statt der statischen Variablen zu modifizieren erklärt:

int intdelay = Integer.parseInt(no); 

MainActivity.intdelay = Integer.parseInt(no); 

sein sollte Wenn Sie beheben, dass Sie in den Speicher Sichtbarkeit Probleme laufen wird. Änderungen, die von einem Thread vorgenommen werden, sind nicht für andere Threads sichtbar, es sei denn, Sie verwenden eine Form der Synchronisierung.

Ich würde Markierung vorschlagen die intdelay Variable als volatile:

public static volatile int intdelay = 1000; 
+0

Ich habe das versucht, aber das Ergebnis nicht geändert – Aloweiwi

+0

@Aloweiwi können Sie Ihre Frage mit dem aktualisierten Code aktualisieren? – rohitvats

+0

Aktualisiert ........ – Aloweiwi

0

Es ist möglich, Ihren Code Ausnahme und gehen in catch-Anweisung wirft, so dass der Wert standardmäßig immer noch die gleichen sein, die 1000 Überprüfen Sie Ihre

int intdelay = Integer.parseInt(no); 

Verwenden Sie logd/toast, um zu überprüfen, welchen Wert Sie analysieren möchten. Gefallen Sie diese wenn in Aktivitätsklasse

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

Kann das Symbol 'getContext' nicht auflösen – Aloweiwi

+0

dann ersetzen Sie getContext() mit Ihrem Aktivitätsnamen so etwas wie MainActivity(). Dies – Vaygeth

+0

Es verursacht einen Absturz der App vor dem Start – Aloweiwi

0

warum u nicht Verzögerung in runnable erklären?

siehe meine Antwort spricht runnable Post Schleife

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

Beispiel:

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

können Sie erweitern (implementieren) runnable als eigene Klasse (abstract ohne run) (mit Getter/Setter) und definieren Sie dann diese Runnable als Variable und verwenden Sie

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

} 

dann verwenden:

KlasseA

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

Beispiel Verwendung von Fangnumber

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

Ich muss den Verzögerungswert von einer Bearbeitungsbox erhalten – Aloweiwi

+0

@Aloweiwi siehe bearbeiten – ceph3us

1

Sie ändern nie den Wert von intdelay. MainActivity.intdelay = Integer.parseInt(no); vergleicht, nicht ändern. Verwenden Sie ==, um den neuen Wert festzulegen. Sie sollten Ihre Variablen auch privat deklarieren und Getter/Setter-Methoden erstellen. Sie sollten auch in Erwägung ziehen, Ihre Verzögerungsvariablen in Ihre Runnable zu verschieben, wenn sie nicht anderweitig benötigt werden.

+0

Ist diese Frage gelöst? Dann markiere es bitte als gelöst. –

Verwandte Themen