Android Handler机制:子线程更新主线程UI示例

需积分: 10 0 下载量 104 浏览量 更新于2024-09-07 收藏 16KB DOCX 举报
"该资源主要讲解了Android中的Handler消息传递机制,并通过一个具体的例子展示了如何在子线程中更新主线程的UI界面,即在文本框中动态生成随机数。" Handler消息传递机制是Android系统中用于在不同线程之间进行通信的一种方式,特别是用于在后台线程(如子线程)向主线程(UI线程)发送消息并更新用户界面。在Android中,主线程负责处理所有的UI操作,因此任何与UI相关的修改都必须在主线程中执行。如果在子线程中直接修改UI元素,会导致应用程序崩溃。 在给出的示例代码中,`MainActivity` 是一个继承自 `Activity` 的类,它包含两个 `TextView` 对象:`myText` 和 `myText2`。当应用启动时,`onCreate` 方法会被调用,这里设置了初始的文本值。然后,创建了一个新的线程来执行一个 `Runnable` 任务。 在 `Runnable` 的 `run` 方法内部,使用了一个无限循环 (`while (true)`) 来每300毫秒生成一个新的随机数。但是,由于更新UI的操作 `myText2.setText()` 需要在主线程中执行,因此这段代码会导致错误,因为它是从子线程中调用的。 为了正确地使用Handler来更新UI,我们需要做以下几步: 1. 创建一个 `Handler` 对象,通常在主线程中创建,这样它可以关联到主线程的消息队列。 2. 在 `Runnable` 中,创建一个 `Message` 对象,并设置其 `what` 或 `obj` 属性来携带数据。 3. 使用 `Handler` 的 `sendMessage()` 方法发送这个 `Message`。 4. 在 `Handler` 的 `handleMessage()` 方法中,接收到消息后,从 `Message` 中提取数据,并在主线程中更新UI。 正确的实现应该如下所示: ```java public class MainActivity extends Activity { private TextView myText, myText2; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { double rand = msg.obj; myText2.setText("子线程随机数为:" + rand); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myText = (TextView) findViewById(R.id.myText); myText2 = (TextView) findViewById(R.id.myText2); double rand = Math.random(); myText.setText("主线程随机数为:" + rand); new Thread(new Runnable() { @Override public void run() { try { while (true) { Thread.sleep(300); double rand = Math.random(); // 使用Handler发送消息 Message message = new Message(); message.obj = rand; handler.sendMessage(message); } } catch (Exception e) { e.printStackTrace(); } } }).start(); } // ... 其他方法保持不变 } ``` 在这个修正后的版本中,我们创建了一个Handler实例,并重写了 `handleMessage()` 方法来处理由子线程发送的消息。在子线程的 `run()` 方法中,我们生成随机数后,通过 `handler.sendMessage()` 将消息发送到主线程,而不是直接更新UI。这样,UI更新操作就会在主线程的 `handleMessage()` 方法中执行,确保了线程安全。