java - Android如何从其他类更新(UI线程)(真的吗?)

标签 java android android-asynctask google-cloud-messaging

你可能知道Google Cloud Messaging

问题是,当服务器触发 gcm 消息时,我的应用程序从 google play 服务接收到一个 bundle ,这发生在 GcmBroadcastReceiver.java 处。在这里,我可以将此数据发送到其他类,以便附加来自服务器的一些信息......好吧。例如,当我尝试更新 UI 线程中的某些 View 时,我陷入了困境。

我该怎么做?

想象一下,当我声明 View 等时,MainActivity.java 是 UI 线程。

我尝试在这里创建一个公共(public)静态方法,可以通过以下方式直接由GcmBroadcastReceiver.java调用:MainActivity.*updateUI*(args..),但它抛出了这个异常:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

有人可以尝试向我解释一下吗?我也知道 asyncTask 但我无法想象它是如何工作的。我还发现一些页面解释了由 UI 线程本身触发的事件,就像在后台执行某些任务的可运行对象一样。我正在寻找这样的东西:

MainActivity extends Activity{

    ...
    protected void onCreate(Bundle blabla)..{

    setContentView(R.layout.blabla);

    registerSomeEvent(this);

    }

    private void handleEvent(Bundle ...){

    ... do stuff with the data provided in the UI thread

    }

} 

GcmBroadcastReceiver 处,当 gcm 推送一些数据时,触发该神奇事件,以便使用 ListViews 等 View 在 UI 线程上执行更新 TextView

最佳答案

一种方法是使用 use LocalBroacastManager 。对于如何实现,how to use LocalBroadcastManager? 上有一个很好的例子。 。

LocalBroadcast Manager is a helper to register for and send broadcasts of Intents to local objects within your process. The data you are broadcasting won't leave your app, so don't need to worry about leaking private data.`

您的 Activity 可以注册此本地广播。当您在 GcmBroadcastReceiver 中收到某些内容时,您可以从 GCMBroadcastReceiver 发送本地广播。在您的 Activity 中,您可以收听广播。这样,如果 Activity 位于最前面/处于 Activity 状态,它将收到广播,否则不会。因此,每当您收到本地广播时,如果 Activity 处于开放状态,您就可以执行所需的操作。这就像对 Activity 说“嘿 Activity,我收到一条消息。用它做任何你想做的事情”。

如果你想为整个应用程序做,那么你可以让你的所有 Activity 扩展一个抽象 Activity 。在这个抽象 Activity 类中,您可以为此“LocalBroadcast”注册它。另一种方法是在您的所有 Activity 中注册 LocalBroadcast(但是您必须管理如何仅显示一次消息)。

关于java - Android如何从其他类更新(UI线程)(真的吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28681877/

相关文章:

Android - 在 onBackPressed() 之后执行函数;

java - 执行 doInBackground() android 时发生错误

Android - 如何将图片 url 转换为图片?

android - 状态栏上的图像叠加

java - 如何使所有语言的 View 顺序相同

java - 如何在外部tomcat中部署Spring-boot REST API

java - 绕过登录屏幕

android - 开发Html5和手游

android - 在 Android 中加载 fragment 需要更多时间

java - 在java中从像素数组创建图像