一般来说我们在开发android时,都会把一些耗时比较长的任务放在子线程中运行以免卡住主线程从而造成比较差的用户体验,比如说从网络上下载文件一般就要放入子线程中来处理,而一般下载的时候都会有一个progress bar进度条来动态显示下载进度,但是我们知道在android里面不是线程安全的,所以android有阻止子线程更新组件的机制。如果强制运行,就会报android.view.ViewRootImpl$CalledFromWrongThreadException,本文以网络聊天为例(侦听另一方发过来的流数据,肯定得用子线程来嘛O(∩_∩)O~~)
先贴一段代码:意思很简单,就是一直在监听,当收到消息的时候更新组件textView
new Thread() {
public void run() {
while (true) {
try {
String s = dis.readUTF();
textView.setText(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
很显然,这样会报错,图片如下:
那么我们该怎么解决呢?android给我们提供了一种消息处理机制,即handler,用来处理不同线程之间的消息。每个线程都有属于自己的一个handler,可以直接通过new方法得到,而在子线程中,我们可以把接收到的信息封装在一个Message对象里面,并调用主线程中的handler对象的sendMessage(Message msg)方法,将该Message对象传递过去,然后主线程的handler收到Message后就会自动调用handleMessage(Message msg)方法,我们就可以通过重写该方法(在主线程中完成)来实现我们想要的操作了。
主线程中的代码:
// 获取handler对象,该对象为全局变量
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 获取封装在Message对象中的信息
String s = (String) msg.obj;
// 在主线程中对组件进行操作
textView.append("对方:" + s + '\n');
}
};
子线程中的代码:
new Thread() {
public void run() {
while (true) {
try {
// 从网络流中读取字符串
String s = dis.readUTF();
// 创建Message对象
Message message = Message.obtain();
// 封装数据
message.obj = s;
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
- 大小: 60.5 KB
分享到:
相关推荐
总之,Android子线程间的通信是应用开发中的关键技能,理解并熟练掌握这些方法对于优化应用性能和用户体验至关重要。通过实践和研究`MultiThread`中的示例,开发者可以更好地理解和运用这些技术。
理解并熟练运用Handler、Looper和Message机制对于进行高效的Android应用开发至关重要,它能帮助开发者避免在主线程中执行耗时操作导致的ANR(Application Not Responding)错误,提升用户体验。同时,这也是一种线程...
在Android应用开发中,由于主线程负责用户界面的更新与交互,因此对于耗时操作,如网络请求和图片加载,必须在子线程中执行,以免阻塞UI导致应用无响应(ANR)。本主题主要关注如何在Android中利用子线程加载URL上的...
2. 子线程中无法直接修改UI组件,因为Android系统不允许非主线程对UI进行操作。 3. 如果需要在子线程中更新UI,必须通过Handler、runOnUiThread或使用Android提供的AsyncTask等机制,将任务回调到主线程执行。 在...
在Android应用开发中,UI(用户界面)的更新必须在主线程中进行,因为主线程是负责处理用户交互和绘制界面的。然而,通常我们会在子线程中执行耗时操作,如网络请求、数据库查询等,以避免阻塞主线程,导致应用无...
在Android开发中,由于UI操作必须在主线程中执行,因此当我们在子线程中处理数据后,需要将结果安全地传递到主线程进行UI更新。以下将详细讲解三种在子线程中更新UI线程的方法,特别是Handler的两种用法。 1. ...
由于Android系统对主线程的限制,耗时的操作(如网络请求、数据库操作等)不能在主线程中执行,否则会导致应用无响应(ANR)。为了解决这个问题,我们通常会在子线程中执行这些任务。 子线程用于执行后台任务,但...
而复杂的计算或网络请求等耗时操作不能在主线程中执行,否则会导致应用无响应(ANR)。因此,我们通常会创建一个新的子线程来执行这些任务,以避免阻塞主线程。 AsynTask是Android提供的一种轻量级的异步处理类,它...
在Android开发中,由于UI操作必须在主线程中执行,因此在子线程中处理耗时任务后更新用户界面(UI)成为了一项常见的需求。本文将深入探讨在子线程中更新UI的三种有效方法,并同时讲解如何在Android中获取和处理...
在Android中,由于UI单线程模型的限制,只有主线程可以更新UI元素,所以当子线程执行完任务后,如果需要更新UI,它不能直接操作UI元素。它必须通过特定的通信机制来与主线程通信,告知主线程进行相应的UI更新。 ###...
由于Android系统的安全机制,所有与UI相关的操作必须在主线程中执行,因此我们不能在子线程中直接修改UI组件,否则会引发“CalledFromWrongThreadException”。 2. Handler(处理者): Handler是Android中用于在...
这是因为Android的UI更新机制要求所有对UI的操作必须在创建该UI的线程(主线程)中执行。 **解决办法** 1. **Handler**: 使用`Handler`对象可以在主线程中发送消息或Runnable对象,从而在主线程中执行UI更新。在...
在Android应用开发中,主线程(也称为UI线程)负责处理用户界面的更新和交互,而子线程(通常是非UI线程)则用于执行耗时操作,如网络请求、文件读写等,以避免阻塞UI。为了在主线程和子线程之间进行有效的通信,...
`runOnUiThread()`方法也可用于在主线程中执行代码,但通常不推荐,因为它缺乏灵活性和错误处理机制。 总结来说,理解Android中的UI主线程和子线程的运行原理以及它们之间的协作方式是开发高效、流畅的应用的关键。...
- 默认情况下,Android系统建议在主线程之外处理多媒体播放,以避免阻塞UI线程。因此,在子线程中使用MediaPlayer可以提高应用的响应速度,防止用户界面冻结。 2. **在线播放音频**: - MediaPlayer支持HTTP或...
在Android应用开发中,"Android耗时操作"是一个重要的主题,因为主线程(UI线程)需要保持流畅,不能被长时间运行的任务阻塞。本文将深入探讨如何利用Handler机制来处理耗时操作,以避免影响用户体验。我们以一个...
在Android系统中,UI线程(也称为主线程)是应用程序与用户交互的主要通道,它负责处理所有的用户界面更新和事件响应。理解Android的UI线程机制至关重要,因为错误地在非UI线程中操作UI组件会导致应用崩溃或出现不...
Android的UI操作必须在主线程(也称为UI线程)中进行,因此,任何耗时操作都不能在主线程中执行,以免阻塞UI导致应用无响应。通常我们会使用子线程(如AsyncTask、Handler、Thread或Runnable)来处理这些任务。当子...
由于 Android 的 UI 组件只能在主线程中更新,因此需要使用特殊的方法来实现子线程中更新 UI。本文将介绍六种常见的方法来实现子线程中更新 UI。 方式一:Handler 和 Message Handler 是 Android 中的一个核心组件...
主线程(Main Thread),通常也被称作UI线程,是Android应用启动后首先创建的一个线程。主线程的主要职责是处理用户交互并绘制用户界面。因此,所有与用户界面相关的操作都应该在主线程中执行,包括但不限于界面元素...