2016-04-04 13 views
0

Grundsätzlich, ich brauche eine Timertask in einem Fragment zu verwenden, aber dieser Fehler angezeigt:Timertask innerhalb Fagment

04-04 15:01:02.710 28397-28528/com.example.sdilab.pap E/AndroidRuntime: FATAL EXCEPTION: Timer-1 
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5471) 
    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1007) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.support.v4.widget.DrawerLayout.requestLayout(DrawerLayout.java:1255) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:334) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:334) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.view.View.requestLayout(View.java:15850) 
    at android.widget.TextView.checkForRelayout(TextView.java:6615) 
    at android.widget.TextView.setText(TextView.java:3753) 
    at android.widget.TextView.setText(TextView.java:3608) 
    at android.widget.TextView.setText(TextView.java:3583) 
    at com.example.sdilab.pap.StepsFragment$1.run(StepsFragment.java:87) 
    at java.util.Timer$TimerImpl.run(Timer.java:284) 

Und das ist der Code, den ich verwenden müssen:

timer.schedule(new TimerTask() { 
      public void run() { 
       double value = Double.parseDouble(readFromFile()); 
       String roundedvalue = Math.round(passos) + ""; 
       textView.setText(roundedvalue); 

      } 
     }, 0, 1*1000); 

Meine Frage ist, : Wie kann ich diesen Code verwenden/dasselbe Ergebnis erzielen, damit ich diesen Code in meinem Fragment verwenden kann?

Antwort

1

Verwenden runOnUiThread() Methode TextView

timer.schedule(new TimerTask() { 
       public void run() { 
        double value = Double.parseDouble(readFromFile()); 
        String roundedvalue = Math.round(passos) + ""; 

     runOnUiThread(new Runnable() { 
       public void run() { 
        textView.setText(roundedvalue); 
       } 
      }); 



       } 
      }, 0, 1*1000); 
+0

Ich kann runOnUiThread nicht verwenden, es heißt: Kann Methode 'runOnUiThread (anonyme java.lang.Runnable)' –

+1

nicht lösen @ AntónioPaulo versuchen getActivity(). RunOnUIThread –

0

Ihr Problem ist, zu aktualisieren, dass Sie Ihre Ansichten außerhalb des Haupt-Thread versuchen, zu aktualisieren. Eine einfache Möglichkeit, dies zu umgehen, ist die Verwendung eines Handlers, um sicherzustellen, dass Sie Ihre Ansichten auf die richtige Weise aktualisieren. Hier ein Beispiel:

private Handler updateHandler = new Handler(); 

timer.schedule(new TimerTask() { 
     public void run() { 
      double value = Double.parseDouble(readFromFile()); 
      String roundedvalue = Math.round(passos) + ""; 
      updateHandler.postRunnable(new Runnable() { 
       public void run() { 
        textView.setText(roundedvalue); 
       } 
      }); 
     } 
    }, 0, 1*1000); 

Es gibt auch eine runOnUiThread() Methode, wenn Sie in einer Aktivität sind, dass das gleiche tun.