0

好的 - 我知道必须有一个简单的解决方案,但对于我的生活,我无法弄清楚。

编写一个非常基本的 android 活动来简单地遍历 0-99。我有一个要显示计数的文本视图。发生的情况是它只是保持空白直到结束,然后显示结束计数(99)。

不确定 textview 是否是正确的显示方式或答案是什么。任何帮助是极大的赞赏。提前致谢

4

4 回答 4

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 个需要很短的时间,给出只看到最后一个变化的视觉结果。

于 2013-04-05T16:15:40.523 回答
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 类的信息。

警告:此代码泄漏 Activity 大约 5 秒,不应直接在生产代码中使用。您需要Runnable在适当的时候从消息队列中删除(可能在 onDestroy 中,但这取决于您的需要)。

View.removeCallbacks用于防内存泄漏。

于 2013-04-05T16:31:16.223 回答
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();
}  
 }
于 2013-04-05T16:34:19.497 回答
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);
    }
}

}

于 2013-04-05T17:03:43.223 回答