调度程序不定期更新textview

时间:2015-10-20 07:18:29

标签: android textview

我正在尝试从SchedulerExecutiveService更新textview中的文字。但奇怪的是,textview只是第一次更新而不是之后。

ScheduledExecutorService textService = Executors.newScheduledThreadPool(1);
    textService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            Log.d("sg", "Logging Seconds");
            textStart.setText("Dyanamic text here.");
        }
    }, 0, 1, TimeUnit.SECONDS);

如果我删除textStart.setText(..)部分,则此代码正常运行。

4 个答案:

答案 0 :(得分:1)

你可以这样做:

public class MainActivity extends Activity {

    private TextView textStart;
    private int i= 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textStart = (TextView)findViewById(R.id.textStart);

        ScheduledExecutorService textService = Executors.newScheduledThreadPool(1);
        textService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                Log.i("sg", "Logging Seconds");
                textStart.post(new Runnable() {
                    @Override
                    public void run() {
                        i++;
                        textStart.setText(""+i);
                    }
                });
            }
        }, 0, 1, TimeUnit.SECONDS);
    }
}

它对我来说很好。

答案 1 :(得分:0)

textStart.setText("Dyanamic text here.");内包裹runOnUiThread行,因为scheduleAtFixedRate Runnable在无法访问UI元素的背景线程上调用。

答案 2 :(得分:0)

您必须在runonUiThread中更新textview。

我用Timer来更新我的textview。试试这个,它会对你有帮助。

new Timer().schedule(new TimerTask() {

 @Override
public void run() {

 mActivity.runOnUiThread(new Runnable() {

  @Override
  public void run() {
   // TODO Auto-generated method stub
   timertap.setText(timer_count + "");
  }
 });


 }
}, 1000,1000);

答案 3 :(得分:0)

我终于使用Rx以非常轻量级的方式获得了相同的结果。请检查以下代码。

subscription = Observable
            .interval(0, 1, TimeUnit.SECONDS, Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Long>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Long aLong) {
                    int millis = mediaPlayer.getCurrentPosition();
                    String time = String.format("%d:%d sec",
                            TimeUnit.MILLISECONDS.toMinutes(millis),
                            TimeUnit.MILLISECONDS.toSeconds(millis) -
                                    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
                    );
                    textStart.setText(time);
                }
            });