runOnUiThread不能正常工作

问题描述:

我想在android中创建显示剩余时间(秒)的textview。runOnUiThread不能正常工作

已经使用runOnUiThread和Hadnler这一切,似乎一切正常(sysout和调试显示,两个线程都执行和值更新正常)。 但是,在UI上,textview值未正确更新。当线程完成时它会使用上一个值更新。

我在片段的私有方法内写入下面的代码。

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

handler.post(new Runnable() { 
     @Override 
     public void run() { 
      while(true) 
      { 
       System.out.println("Text:"+ ""+maxAllowedSeconds); 
       try { 
        TimeUnit.SECONDS.sleep(1); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       maxAllowedSeconds--; 
       if(maxAllowedSeconds <= 0) 
        break; 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         System.out.println("Running on UI Thread : " + maxAllowedSeconds); 
         timerText.setText("" + maxAllowedSeconds); 
        } 
       }); 
      } 
     } 
    }); 

通过了这方面的许多以前的问题,但没有一个似乎有这个问题的具体解决方案。

在此先感谢。

SOLUTOIN:

最后我用AsynchTask其工作完全符合预期。

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

代替Handler,它与AsynchTask(不需要runOnUiThread)一起工作。

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