2016-09-24 2 views
0

Ich versuche Textview in Android zu erstellen, die die verbleibende Zeit (Sekunden) anzeigen.runOnUiThread funktioniert nicht richtig

Haben Sie runOnUiThread und Hadnler dafür verwendet und alles scheint gut zu funktionieren (Sysout und Debug zeigt, dass beide Threads ausgeführt werden und Wert ordnungsgemäß aktualisiert wird). Auf der Benutzeroberfläche wird der Textansichtswert jedoch nicht ordnungsgemäß aktualisiert. Wenn der Thread fertig ist, wird er mit dem letzten Wert aktualisiert.

Ich schreibe den folgenden Code in private Methode des Fragments.

final TextView timerText = (Textansicht) mainView.findViewById (R.id.timerText); timerText.setText (R.string.maxAllowedSeconds);

Durch viele der vorherigen Fragen in diesem Bereich gegangen, aber keine scheint konkrete Lösungen für dieses Problem zu haben.

Vielen Dank im Voraus.

SOLUTOIN:

Schließlich habe ich AsynchTask, die perfekt funktioniert wie erwartet.

private class RapidFireAsyncTimerTask extends AsyncTask<Integer, Integer, Void> { 

     private Context context; 
     private View rootView; 

     public RapidFireAsyncTimerTask(Context ctx, View rootView) { 

      this.context = ctx; 
      this.rootView = rootView; 
     } 

     @Override 
     protected Void doInBackground(Integer... params) { 

      int maxSec= params[0]; 
      while (true) { 
       try { 
        TimeUnit.SECONDS.sleep(1); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       publishProgress(--maxSec); 
       if (maxSec <= 0) 
        break; 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(final Integer... values) { 

      ((TextView) rootView.findViewById(R.id.timerText)).setText("" + values[0]); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 

      //next task 
     } 
    } 

Antwort

0

Statt Handler, arbeitete sie mit AsynchTask (Nr runOnUiThread erforderlich).

public RapidFireAsyncTimerTask(Context ctx, View rootView) { 

     this.context = ctx; 
     this.rootView = rootView; 
    } 

    @Override 
    protected Void doInBackground(Integer... params) { 

     int maxSec= params[0]; 
     while (true) { 
      try { 
       TimeUnit.SECONDS.sleep(1); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      publishProgress(--maxSec); 
      if (maxSec <= 0) 
       break; 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(final Integer... values) { 

     ((TextView) rootView.findViewById(R.id.timerText)).setText("" + values[0]); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 

     //next task 
    } 
}