2012-07-21 37 views
1

我试图做一个简单的计数器,从5计数到1并在每秒钟后更新视图。我试过没有处理程序,只是用一个简单的循环,但它只是在等待或强制关闭后显示给我1。我已经尝试了runOnUIThread和线程,但我错过了一些东西。使用处理程序更新TextView

这里是我的代码:

package com.ammad.test; 
import android.os.Bundle; 
import android.os.Handler; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.support.v4.app.NavUtils; 

public class Main extends Activity { 

    TextView tv; 
    Button b1; 
    Handler mHandler; 
    int i = 5; 
    private Runnable runnable; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv = (TextView) findViewById(R.id.tvShow); 
     b1 = (Button) findViewById(R.id.bt1); 



     runnable = new Runnable() { 
      public void run() { 
       // do your stuff - don't create a new runnable here! 
       tv.setText(String.valueOf(i)); 
       i--; 
       mHandler.postDelayed(runnable, 500); 

      } 
     }; 
     b1.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       mHandler.post(runnable); 
       mHandler.removeCallbacks(runnable); 

      } 
     }); 

    } 

    public void doTheLoop() { 

     /* 
     * runOnUiThread(new Runnable() { 
     * 
     * public void run() { for (int i = 5; i >= 1; i--) { // TODO 
     * Auto-generated method stub tv.setText(Integer.toString(i)); for (int 
     * j = 0; j < 200000; j++) ; } } 
     * `enter code here` 
     * }); 
     */ 
     // mHandler.post(runnable); 
    } 
} 

回答

0

你在哪里实例mHandler?我认为代码丢失了,否则这会失败,并出现NullPointerException异常。这很重要,因为如果您只是在onCreate中用no-arg构造函数实例化它,它将使用UI线程的消息队列。

还有其他的问题:在你的Runnable.run方法中,你实际上并不检查i是否小于零,所以它总是会自己调用postDelayed。此外,您正在从非UI线程更新UI(setText),这可能会导致未定义的行为。

我认为你的代码比它需要的复杂一点。如果这个例子是愚蠢的,并隐藏你的实际意图,这是一个例子可能太简单了,但这里的东西基本上工作,虽然你需要编辑它一点来编译(catch InterruptedException等)

new Thread() { 
     public void run() { 
      while(i > 0) { 
       Thread.sleep(1000); 
       mTextView.post(new Runnable() { 
        public void run() { 
         mTextView.setText(Integer.toString(i--)); 
        } 
       }); 
      } 
     } 
    }.start(); 
+0

thans alot dude ...你是一个救星...我一直在尝试做同样的事情,但我认为我错过了这个mTextView.post ... thanx了.. – Ammad 2012-07-21 12:29:52