我正在尝试从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(..)
部分,则此代码正常运行。
答案 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);
}
});