好的 - 我知道必须有一个简单的解决方案,但对于我的生活,我无法理解。
编写一个非常基本的android活动,简单地遍历0-99。我有一个textview,我想显示计数。会发生什么,它只是保持空白直到结束,然后显示结束计数(99)。
不确定textview是否是正确的显示方式或答案是什么。任何帮助是极大的赞赏。提前致谢
答案 0 :(得分:2)
我猜你的onCreate()
代码如下:
for (int i=0;i<100;i++) {
tv.setText(String.valueOf(i));
Thread.sleep(100); // or something to delay for a bit
}
这将为您提供您正在描述的输出。
与许多GUI框架一样,Android的UI是事件驱动的。调用setText()
不会更新屏幕。相反,它将消息放入队列,要求更新屏幕。该队列由主应用程序线程处理...首先调用onCreate()
的同一线程。因此,您正在做的是排队100个setText()
调用,在您的循环完成之前,这些调用都不会被处理。应用其中的100个只需要很少的时间,只能看到最后的变化。
答案 1 :(得分:2)
尝试在onCreate中使用这样的代码(其中number
被定义为字段):
textView.post(new Runnable() {
@Override
public void run() {
number++;
textView.setText("counting: " + number);
if (number < 100) {
textView.postDelayed(this, 50);
}
}
});
编辑:代码已编辑为View类具有post和postDelayed,后者将调用传播到内部的Handler实例。
您需要阅读一些关于Handler class。
的内容 警告:此代码在约5秒的时间内泄漏Activity,不应在生产代码中直接使用。您需要在适当的时间从消息队列中删除Runnable
(可能在onDestroy中,但这取决于您的需要)。
View.removeCallbacks用于反内存泄漏。
答案 2 :(得分:0)
使用以固定费率安排的计时器。每秒增加一个计数器。在UI线程上设置文本。需要时取消计时器。
public class MainActivity extends Activity {
TextView _tv;
Timer _t;
int _count=0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
_tv = (TextView) findViewById( R.id.textView1 );
_t = new Timer();
_tv.setText(""+_count);
_t.scheduleAtFixedRate( new TimerTask() {
@Override
public void run() {
_count++;
runOnUiThread(new Runnable() //run on ui thread
{
public void run()
{
_tv.setText(""+_count);
if(_count==99)
{
_t.cancel();
}
}
});
}
}, 1000, 1000 );
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
_t.cancel();
}
}
答案 3 :(得分:0)
使用倒计时器,在下面的代码中,onTick()会每秒调用一次,在这里你可以每秒显示/更新你的号码。 根据您的需要设置间隔。它在几秒钟内。
公共类TimerActivity扩展了Activity {
private final long startTime = 100 * 1000;
private final long interval = 1 * 1000;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
countDownTimer = new MyCountDownTimer(startTime, interval);
countDownTimer.start();
public class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long startTime, long interval) {
super(startTime, interval);
}
@Override
public void onFinish() {
text.setText("Time's up!");
}
@Override
public void onTick(long millisUntilFinished) {
text.setText(100 - millisUntilFinished/1000);
}
}
}