从线程更新textView

9
在我的OnCreate方法中,我创建了一个线程来监听传入的消息!
In OnCreate() {

//Some code

myThread = new Thread() {

            @Override

            public void run() {

                receiveMyMessages();

            }
        };
myThread.start();

// Some code related to sending out by pressing button etc.

}

Then, receiveMyMessage() functions…

Public void receiveMyMessage()
{

//Receive the message and put it in String str;

str = receivedAllTheMessage();

// <<    here I want to be able to update this str to a textView. But, How?
}

我查看了这篇文章,但对我无效,没有任何帮助!

2个回答

19

在 Android 应用程序中,任何 UI 更新都必须发生在 UI 线程上。如果您生成一个线程来在后台执行工作,则必须在触摸视图之前将结果编组回 UI 线程。您可以使用 Handler 类来执行编组:

public class TestActivity extends Activity {
    // Handler gets created on the UI-thread
    private Handler mHandler = new Handler();

    // This gets executed in a non-UI thread:
    public void receiveMyMessage() {
        final String str = receivedAllTheMessage();
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                // This gets executed on the UI thread so it can safely modify Views
                mTextView.setText(str);
            }
        });
}

AsyncTask类可以为您简化许多细节,这也是您可以考虑的内容。例如,我认为它会为您提供线程池,以帮助减轻每次想要进行后台工作时产生的一些成本。


大家好,非常感谢你们抽出时间。但是还没有运气!我正在尝试重新表达我的问题:(连同原始问题一起)在OnCreate中调用receiveMyMessage(),它在一个线程中!这意味着这个receiveMyMessage在一个单独的线程中。在这个线程中,我有一个while循环,它正在读取是否有任何消息!public void receiveMessages() {while循环(条件){str = receivedAllTheMessage();//现在,在这里我想更新GUI元素tv.settext ...等等..}} - Droid-Bird
1
以下是有关此答案的附加提示:您可以使用Activity的处理程序对象跳过创建单独的处理程序。handler = getWindow().getDecorView().getHandler(); - Kent
@Kent 那个技巧可能有用,也可能无用,这取决于你在哪里使用它。我在互联网上找到了那个技巧,并加以利用,但当我在程序中做了一些更改后,它突然间就不起作用了。请参见此处以获取更多信息:http://codereview.stackexchange.com/a/114723/92925 - RenniePet

0

Android支持使用处理程序和sendMessage(msg)进行消息传递并发。(也可以使用处理程序进行共享内存并发。)一个提示是,如果您希望线程在应用程序死亡时死亡,请调用thread.setDaemon(true)。另一个提示是只有一个处理程序,并在消息处理程序中使用message.what和switch语句来路由消息。

代码代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接