`
永远吃不饱
  • 浏览: 10097 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

子线程中更新主线程中的UI

阅读更多
大家已知处理在线程中更新UI的方法有两种普遍方法:
1.异步任务
2.发送广播

下面介绍的这个方法可以有效、简单的解决这个问题。
关于EventBus的介绍这里就不写了,只是记录一下其简单应用。

根据需要可以在活动开始和结束时添加EventBus的注册和注销。
@Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //注册
        EventBus.getDefault().register(this);
}
@Override
    protected void onDestroy() {

        //注销
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }


在简单的button中改变界面中的textView
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  new Thread(new Runnable() {
                      @Override
                      public void run() {
                          //网络操作
  
                          Log.d(TAG, "post");
                          //发布一个事件:  String
                          EventBus.getDefault().post("info");
                      }
                  }).start();

            }
        });

/**
     * 订阅
     * 不加 threadMode 默认在哪发的时间就从那个线程执行 与POSTING相同
     * ThreadMode.MAIN 在创建方法中的线程中执行
     * @param info  该方法是否收到数据取决于参数的类型  类型相同就可以收到发送数据
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void updateInfo(String info){
        //更新UI
        textView.setText(info);
        Log.d("MAIN", Thread.currentThread().getName());
        Log.d("MAIN", info);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void showInfo(Info info){
        textView.setText(info.toString());
    }

    class Info{
        private int i = 0;
        private int j = 1;
    }

    @Subscribe(threadMode = ThreadMode.POSTING)
    public void updateInfo2(String info) {
        //更新UI
//        textView.setText(info);
        Log.d("POSTING", Thread.currentThread().getName());
        Log.d("POSTING", info);
    }

    /**
     * 如果在主线程中发布事件,该方法启动子线程执行
     * 如果在子线程中发布事件,该方法在当前子线程执行方法
     * @param info
     */
    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void updateInfo3(String info){
        Log.d("BACKGROUND", Thread.currentThread().getName());
        Log.d("BACKGROUND", info);
    }

    /**
     * 在新线程执行该方法(不在当前线程)
     * 主线程发布事件,在子线程中执行
     * 子线程发布事件,启动新的子线程执行
     * @param info
     */
    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void updateInfo4(String info){
        Log.d("ASYNC", Thread.currentThread().getName());
        Log.d("ASYNC", info);
    }


相应工具包附件里有
分享到:
评论

相关推荐

    子线程更新主线程数据

    本文将深入探讨如何安全、有效地在子线程中更新主线程的数据。 首先,理解线程安全。线程安全是指当多个线程访问一个对象时,如果不用考虑线程的调度顺序,程序都能正常工作,那么这个对象就是线程安全的。在Java或...

    子线程中更新UI线程的三种方法

    以下将详细讲解三种在子线程中更新UI线程的方法,特别是Handler的两种用法。 1. Handler+Looper Handler是Android中用于消息传递的关键组件,它与Looper配合使用,可以在不同线程之间传递消息。首先,我们需要在...

    C#子线程更新UI控件的方法实例总结

    // 子线程中通过UI线程上下文更新UI } private void SetLabelText(object text) { this.label1.Text = text.ToString(); } ``` 在这个例子中,`Post`方法会异步地执行`SetLabelText`方法,确保UI更新在正确的...

    QT子线程更新主线程

    - 避免在子线程中直接删除QThread对象,应该在主线程中停止并删除它,防止未定义的行为。 - 使用`quit()`和`wait()`方法优雅地结束子线程。 8. **性能优化**: - 尽可能减少主线程和子线程之间的通信,避免不必...

    安卓UI线程和子线程通讯更新UI实例

    在Android应用开发中,UI线程(也称为主线程)负责处理用户交互和绘制界面,而子线程通常用于执行耗时操作,如网络请求、数据处理等。由于Android系统的安全机制,直接在子线程中修改UI是不允许的,因此我们需要通过...

    子线程中更新UI的三种方法和获取message的两种方法总结

    主线程中的Looper会接收到这个Message并交给Handler进行处理,从而在主线程中更新UI。 2. **RunOnUiThread** Android提供了`runOnUiThread`这个便捷的方法,可以直接在子线程中调用,将一个Runnable对象放入主线程...

    Qt子线程更新数据发到主线程显示.rar

    // 在这个槽函数中,我们在主线程中更新QTableWidget ui->tableWidget->clearContents(); // 清空现有数据 for (int i = 0; i (); i++) { ui->tableWidget->setItem(i, 0, new QTableWidgetItem(data[i]....

    子线程操作主线程的示例

    接下来,我们来看看如何在子线程中更新主线程。在Java中,我们可以利用`SwingUtilities.invokeLater`或`EventQueue.invokeLater`方法,这些方法会在事件分发线程(即主线程)中执行给定的Runnable。例如: ```java ...

    MFC子线程中更新控件内容的两种办法

    然而,直接在子线程中更新UI控件可能会导致程序崩溃或不稳定,这是因为UI控件的操作通常需要在主线程中进行。因此,在MFC中,我们需要采用合适的方法确保UI更新操作在主线程中执行。本文将详细介绍MFC中更新控件内容...

    子线程和主线程5种交互方式 Demo

    在Android应用开发中,线程间的交互是必不可...这些方法都是为了确保在正确(主线程)的上下文中更新UI,避免出现ANR(Application Not Responding)错误。在实际开发中,应根据具体需求选择合适的方法进行线程间通信。

    在MFC 子线程中使用UI(控件)退出时死锁或者超时处理参考

    在MFC(Microsoft Foundation Classes)框架中,子线程与主线程交互并操作用户界面(UI)时,可能会遇到一些特定的问题,特别是当涉及到退出、死锁或超时的情况。以下是对这些知识点的详细说明: 1. **MFC 子线程**...

    子线程和主线程通过handler 双向通信

    子线程中的任务完成后,可以通过这个Handler发送Message回主线程。 3. **Message的使用**:Message是数据载体,包含要传递的信息和处理消息的目标Handler。通过Message的.what字段标识消息类型,.obj字段携带额外的...

    VS2017-MFC子线程中更新控件的内容框架代码

    在Microsoft Visual Studio 2017 (VS2017) 中开发MFC(Microsoft Foundation Classes)应用程序时,经常会遇到需要在子线程中更新UI(用户界面)控件的情况。由于Windows的消息机制和线程安全性的限制,直接在非主线...

    c#子线程操作UI控件的简单委托 包含带参数和不带参数源码

    这是因为UI更新必须在主线程(也称为UI线程)中进行,以保证线程安全和避免界面卡顿。本文将深入探讨如何在C#中使用委托实现子线程对UI控件的操作,包括带参数和不带参数的场景,并提供源码实例。 1. 跨线程操作UI...

    VS2017工程MFC子线程中更新控件的内容

    为了在子线程中更新UI,我们需要将更新操作通过消息发送到主线程的消息队列,由主线程来执行这些操作。 1. **创建子线程**: 在MFC工程中,可以使用`CWinThread`类的派生类来创建一个新的线程。在派生类的`...

    子线程中修改状态栏信息

    在标题“子线程中修改状态栏信息”中,我们关注的是在非主线程(子线程)中更新UI元素,这里是状态栏。在Windows系统中,UI更新通常由主线程(也称为消息循环线程)处理,因为它们必须遵循消息泵的工作方式。这意味...

    Python+PyQT5的子线程更新UI界面的实例

    然而,直接在非UI线程中更新UI界面可能会引发程序崩溃或其他未定义行为。这是因为UI组件通常是线程不安全的,即它们的设计默认只允许在一个特定的线程(通常称为UI线程或主事件循环)中被访问和更新。 本文将详细...

    Android主线程和子线程区别详解

    3. 如果需要在子线程中更新UI,必须通过Handler、runOnUiThread或使用Android提供的AsyncTask等机制,将任务回调到主线程执行。 在给定的代码示例中,可以看到以下几个关键点: 1. 使用委托(Delegate)来定义多个...

    安卓UI线程机制 ,在子线程中访问UI

    2. 使用Handler:为了在子线程中更新UI,可以创建一个与主线程关联的Handler实例。在子线程中,创建Message,设置其目标为该Handler,然后调用sendMessage()方法将Message放入主线程的MessageQueue。主线程的Looper...

Global site tag (gtag.js) - Google Analytics