2013-04-05 59 views
0

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

编程一个非常基本的android活动,只需遍历0-99。我有一个textview,我想显示计数。会发生什么事情,它只是保持空白直到结束,然后显示结束计数(99)。

不确定textview是正确的显示方式还是答案是。任何帮助是极大的赞赏。在此先感谢

+0

你能发布您的代码?这是一个计时器还是什么?如果你所做的只是在UI线程上运行一个for循环,那就行不通了。 – Karakuri 2013-04-05 16:11:07

+1

向我们显示您的代码,我们可以提供帮助。但我的猜测是你正在使用'for循环'而不是在你的'TextView'上调用'setText()'直到你完全遍历循环 – codeMagic 2013-04-05 16:11:13

+0

...或者你正在做onCreate()。你这样做的方式与你如何去做一样重要。 – Simon 2013-04-05 16:16:19

回答

2

尝试在的onCreate(其中number被定义为场),使用这样的代码:

textView.post(new Runnable() { 
    @Override 
    public void run() { 
     number++; 
     textView.setText("counting: " + number); 
     if (number < 100) { 
      textView.postDelayed(this, 50); 
     } 
    } 
}); 

编辑:代码被编辑为视图类具有柱和postDelayed,其传播调用处理程序例如,它们有内部。

您需要阅读关于Handler class的一些信息。

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

View.removeCallbacks用于抗内存泄漏。

+0

请注意,'postDelayed()'也在'View'中,所以你不需要费心创建一个'Handler'。 – CommonsWare 2013-04-05 16:55:52

+0

@CommonsWare对,我将编辑以简化代码 – 2013-04-05 16:59:08

+0

我试过了(代码来自MaciejGorski),它工作得很好 - 从CommonsWare的评论中,我们仍然担心泄漏问题,因为我们没有使用Handler类? – 2013-04-05 17:24:06

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个只需要很少的时间,只能看到最后的变化。

+0

那么解决方案是什么?将该代码放入AsycTask工作中? – dberm22 2013-04-05 16:19:32

+0

@ dberm22非阻塞操作不需要AsyncTask。 – 2013-04-05 16:34:10

+0

@MaciejGórski所以你将不得不使用处理程序? – dberm22 2013-04-05 16:36:53

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(); 
} 
} 
+0

像MaciejGórski的回答那样,使用'postDelayed()'会更有效率,因为它避免了额外的线程。 – CommonsWare 2013-04-05 16:56:13

+0

@CommonsWare同意。这是一个替代方案。 – Raghunandan 2013-04-05 17:26:37

0

使用一个倒数计时器,在下面的代码,onTick()将调用每一秒,在这里你可以显示/更新你的号码每一秒。 根据您的需要设定间隔。它以毫秒为单位。

公共类TimerActivity延伸活动{

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

}