为 Android 应用程序开发创建多线程应用程序对许多 Android 开发人员来说是一项具有挑战性的任务。单线程和多线程方法用于创建复杂的 Android 企业移动应用程序,因为它们有助于简化代码的功能操作。但有时需要从后台线程更新 UI,了解所执行的操作。如果您曾经尝试从后台线程访问 UI 元素,您已经注意到会抛出异常。本文将解释如何用另一个线程发布的信息通知活动。
对于创建多线程应用程序,Android 默认不允许开发人员在主线程之外修改 UI。许多编码人员都面临这个问题,如果您仍然设法做到这一点,那么您将违反单线程模型的第二条规则,即“ 不要从 UI 线程外部访问 Android UI 工具包 ”,如此处所述 http //developer.android.com/guide/components/processes-and-threads.html 。
问题
在企业 Android 应用中创建复杂的多线程功能时,这些线程生成的信息不会在 UI 中通知,导致应用业务逻辑不匹配和应用程序崩溃。
解决方案
-
实现一个 Handler 类,重写 handleMessage() 方法,该方法将从线程队列中读取消息
-
在工作线程中使用 sendMessage() 方法发送下一条消息
有很多情况需要有一个线程在后台运行,并向主 Activity 的 UI 线程发送信息。从架构层面,我们可以使用两种不同的方法来通知线程活动。
-
Android AsyncTask 类的使用
-
开始一个新线程
使用 AsyncTask 非常方便,因为可能会出现您确实需要自己构建工作线程的情况。在这种情况下,您需要将一些信息发送回 Activity 线程。请记住,如上所述,Android 不允许其他线程修改主 UI 线程的任何内容。相反,您需要将数据包装到消息中并通过消息队列发送它们。
您可以分两部分实现此操作:
第 1 部分 – 添加处理程序
将 Handler 类的实例添加到您的 MapActivity 实例。
public class MyMap extends MapActivity {
. . . .
public Handler _handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.d(TAG, String.format("Handler.handleMessage(): msg=%s", msg));
// This is where main activity thread receives messages
// Put here your handling of incoming messages posted by other threads
super.handleMessage(msg);
}
};
. . . .
}
第 2 部分 – 发布消息
在工作线程中,只要您需要将 处理程序 类实例添加到您的 MapActivity 实例,就会向活动主队列发布一条消息。
public class MyMap extends MapActivity {
. . . .
public Handler _handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.d(TAG, String.format("Handler.handleMessage(): msg=%s", msg));
// This is where main activity thread receives messages
// Put here your handling of incoming messages posted by other threads
super.handleMessage(msg);
}
};
. . . .
}
试试上面的代码,如果仍然无法通知活动信息,请随时联系。
请查看我们解释 移动应用程序测试的博客:最佳实践 。并查看我们的 Android 移动应用程序开发 和测试服务。