【问题标题】:Android: Updating text in the UI thread issueAndroid:在 UI 线程问题中更新文本
【发布时间】:2012-05-02 12:19:13
【问题描述】:

我对@9​​87654321@ 很陌生。我以前用过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 值,但我感觉它只是增加值然后显示它而不是实时更新。任何帮助将不胜感激。

【问题讨论】:

  • 更清楚您希望代码做什么。
  • 我只是想让 i 值在屏幕上明显增加。我现在正在查看 AsyncTask 代码。

标签: android ui-thread


【解决方案1】:

去TextSwitcher

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

如果您希望您的文本视图延迟更新。 使用类似的东西。

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

【讨论】:

  • OP 说...这只是为了测试...我认为不会在单独的线程中执行 i++...
  • 在这种情况下,他将始终看到 1。
  • 只有天知道他要显示什么 0 或 1 或什么
  • 那纯粹是为了测试。我的问题是我不知道如何更新文本视图。它只被调用一次,原来是问题所在。在 setText 之前或之后放置 i++ 并不能真正解决任何问题。抱歉没有说得更清楚。
【解决方案2】:

在 android 中,您不能从另一个线程更新 UI。这是 android 开发中的限制(我认为这是删除不必要的错误的功能)。您可以为此使用 AsyncTask ...

在使用中,您可以在 donInBackground() 中执行长任务,然后可以使用 onProgressUpdate() 更新 UI...参见 AsyncTask 示例 here

编辑

请参阅this 类似问题了解更多信息...

【讨论】:

    【解决方案3】:

    您的问题是因为您只调用了一次mainComputations()。你应该看看AsyncTask 和Android 开发者资源Updating the UI from a Timer

    【讨论】:

    • 啊,在以前的 c++ 或 Java 程序中,总是有各种各样的主循环,我读到 Android 不会以与添加“主循环”相同的方式处理它们,只会导致它挂。我将看一下 AsyncTask 信息。干杯!
    【解决方案4】:

    您不能从另一个线程更新主 UI 线程,因为您需要使用 Handler。更多详情请参考此链接

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-13
        相关资源
        最近更新 更多