Android:更新UI线程问题中的文本

时间:2012-05-02 12:19:13

标签: android ui-thread

我对Android很新。我之前使用过Java但不是大约一年半。我在更新屏幕时遇到问题,或者更确切地说是TextView。我已经在网上寻找了几个小时的解决方案,我有点知道为什么它不起作用,但我不知道如何解决它。

public class PreliminaryActivity extends Activity {

//private static final int MENU_QUIT = Menu.FIRST;
int i = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    getWindow().setBackgroundDrawableResource(R.drawable.background);
    mainComputations();
}

    public void mainComputations(){
        runOnUiThread(new Runnable(){
        //@Override
            public void run(){

                TextView tv = (TextView) findViewById(R.id.time_display);

                tv.setText(new Integer(i).toString());
                i++;
            }
        });
    }

我已经减少了我的程序,所以它应该只是在屏幕上增加一个int值进行测试,它仍然无法正常工作。相反,它只显示'0'。如果我在runOnUiThread()方法之前添加for循环,它将增加i值,但我感觉它只是增加值然后显示它而不是实时更新。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:2)

转到TextSwitcher

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TextSwitcher1.html

如果您希望textview更新一些延迟。 使用这样的东西。

 final int length = 10;
 Thread t = new Thread(new Runnable() {

     @Override
     public void run() {
        for(int i=0 ; i<length; i++) {
           runOnUiThread(new Runnable() {

              @Override
              public void run() {
                tv.setText(new Integer(i).toString());
              }
           }) ; 
           i++;
           Thread.sleep(500);
        }
     }
  });
  t.start();

答案 1 :(得分:0)

在android中,您无法从其他线程更新UI。这是android开发中的限制(我认为这是消除不必要的错误的一个特性)。你可以使用AsyncTask ......

在使用中,您可以在donInBackground()中执行长任务,并且可以使用onProgressUpdate()更新UI ...请参阅AsyncTask示例here

修改

请参阅this类似问题以获取更多信息......

答案 2 :(得分:0)

您的问题是因为您只拨打一次mainComputations()。您应该查看AsyncTask和Android开发人员资源Updating the UI from a Timer

答案 3 :(得分:0)

您无法从另一个线程更新主UI线程,因为您需要使用Handler。有关详细信息,请参阅此链接

http://www.vogella.com/articles/AndroidPerformance/article.html

答案 4 :(得分:0)

我看到的是你只调用一次mainComputations,所以它是0。