【问题标题】:How to set text of text view in another thread如何在另一个线程中设置文本视图的文本
【发布时间】:2012-03-27 06:14:55
【问题描述】:

我正在尝试在另一个线程中设置文本,即子线程。但是对于以下代码,它给出了错误

只有创建视图层次结构的原始线程才能接触其视图。

 

 

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    img = (ImageView)findViewById(R.id.img);
    pb = (ProgressBar)findViewById(R.id.pb);
    this.tv = (TextView)findViewById(R.id.perc);
    tv.setText("30 %");
    pb.setProgress(30);
    pb.setMax(100);
}

public void set(int p)
{
    tv.setText(p + " %");
}

protected void onStart()
{
    super.onStart();
    pb.setProgress(20);

    Thread t = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            try {
                int i = pb.getProgress();
                while(i <100)
                {
                    while(pb.getProgress()<100)
                    {
                        pb.incrementProgressBy(5);
                        Thread.sleep(1000);
                    }
                i+=10;
                pb.setProgress(i);
                Thread.interrupted();
                set(i);
                }
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    });
    t.start();
}

【问题讨论】:

  • Ravi,你不能直接从线程使用 HandlersAsyncTask 更新 UI,看看这个 [Android 线程、处理程序和 AsyncTask ](vogella.de/articles/AndroidPerformance/article.html)
  • 你的意思是一个不同的线程来设置文本,它将使用 handler.post(new Runnable(){ // });
  • 您试图在 Thread 中设置 TextView 值,这就是您收到此错误的原因

标签: android


【解决方案1】:

您需要对该文本视图的引用,然后执行:

textView.post(new Runnable() {
    public void run() {
        textView.setText(yourText);
    } 
});

在 Kotlin 中:

val textView: TextView = findViewById(R.id.textView)
textView.post(Runnable { textView.setText(yourText) })

【讨论】:

  • 感谢这工作。我只想知道这是在创建新的 UI 子线程(父线程)。
  • @LoungeKatt 只有一个 UI 线程。 View.post 使用 Handler,而 Context.runOnUiThread 检查调用线程是否为 ui 线程并发布到 Handler,否则。
  • @LoungeKatt 当我读到您认为将“单独的 UI 线程”作为与“单独的参考”不同的东西时,我不得不咯咯地笑是“过于字面意思”
  • @Bondax 很高兴有些东西让你发笑。听起来你太把自己当回事了。如果您需要使用适当的措辞和清晰的示例来解释整个事情,您可能应该提出一个单独的问题。
  • stackoverflow.com/a/10558238/461982 为避免后来的查看者混淆:主要区别在于runOnUiThread 仍可能导致android.view.ViewRoot$CalledFromWrongThreadException,而post 将保留对正在编辑的视图的特定引用。希望这个措辞对你来说足够清楚;)
【解决方案2】:

使用runOnUiThread 更新 UI 控件。在你的情况下:

runningActivity.runOnUiThread(new Runnable() {
    public void run() {
        tv.setText(p + " %");
    }
});

已编辑:

Activity mActivity;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mActivity= this;
   ...
   ..//The rest of the code
} //close oncreate()

thread{
    mActivity.runOnUiThread(new Runnable() {
        public void run() {
            tv.setText(p + " %");
        }
    });
}

【讨论】:

  • 如何初始化Activity runningActivity。用 null 初始化它会产生运行时错误。
  • 谢谢。这行得通,请建议我使用哪两个,因为两者都在工作。 1) runningActivity.runOnUiThread 或 2) textView.post
【解决方案3】:

您可以使用runOnUiThreadHandler 在TextView 中设置文本。

【讨论】:

    【解决方案4】:

    你可以使用handle

    handler.post(new Runnable() {
        public void run() {
            textView.setText(yourText);
        }
    });
    

    但是你的textViewyourText 必须是类字段。

    在您创建textView 的线程(活动)中使用:

    Handler handler = new Handler();
    

    并将handler 传递给另一个线程。

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2012-08-07
      • 1970-01-01
      相关资源
      最近更新 更多