大家已知处理在线程中更新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线程的方法,特别是Handler的两种用法。 1. Handler+Looper Handler是Android中用于消息传递的关键组件,它与Looper配合使用,可以在不同线程之间传递消息。首先,我们需要在...
// 子线程中通过UI线程上下文更新UI } private void SetLabelText(object text) { this.label1.Text = text.ToString(); } ``` 在这个例子中,`Post`方法会异步地执行`SetLabelText`方法,确保UI更新在正确的...
- 避免在子线程中直接删除QThread对象,应该在主线程中停止并删除它,防止未定义的行为。 - 使用`quit()`和`wait()`方法优雅地结束子线程。 8. **性能优化**: - 尽可能减少主线程和子线程之间的通信,避免不必...
在Android应用开发中,UI线程(也称为主线程)负责处理用户交互和绘制界面,而子线程通常用于执行耗时操作,如网络请求、数据处理等。由于Android系统的安全机制,直接在子线程中修改UI是不允许的,因此我们需要通过...
主线程中的Looper会接收到这个Message并交给Handler进行处理,从而在主线程中更新UI。 2. **RunOnUiThread** Android提供了`runOnUiThread`这个便捷的方法,可以直接在子线程中调用,将一个Runnable对象放入主线程...
// 在这个槽函数中,我们在主线程中更新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 ...
然而,直接在子线程中更新UI控件可能会导致程序崩溃或不稳定,这是因为UI控件的操作通常需要在主线程中进行。因此,在MFC中,我们需要采用合适的方法确保UI更新操作在主线程中执行。本文将详细介绍MFC中更新控件内容...
在Android应用开发中,线程间的交互是必不可...这些方法都是为了确保在正确(主线程)的上下文中更新UI,避免出现ANR(Application Not Responding)错误。在实际开发中,应根据具体需求选择合适的方法进行线程间通信。
在MFC(Microsoft Foundation Classes)框架中,子线程与主线程交互并操作用户界面(UI)时,可能会遇到一些特定的问题,特别是当涉及到退出、死锁或超时的情况。以下是对这些知识点的详细说明: 1. **MFC 子线程**...
子线程中的任务完成后,可以通过这个Handler发送Message回主线程。 3. **Message的使用**:Message是数据载体,包含要传递的信息和处理消息的目标Handler。通过Message的.what字段标识消息类型,.obj字段携带额外的...
在Microsoft Visual Studio 2017 (VS2017) 中开发MFC(Microsoft Foundation Classes)应用程序时,经常会遇到需要在子线程中更新UI(用户界面)控件的情况。由于Windows的消息机制和线程安全性的限制,直接在非主线...
这是因为UI更新必须在主线程(也称为UI线程)中进行,以保证线程安全和避免界面卡顿。本文将深入探讨如何在C#中使用委托实现子线程对UI控件的操作,包括带参数和不带参数的场景,并提供源码实例。 1. 跨线程操作UI...
为了在子线程中更新UI,我们需要将更新操作通过消息发送到主线程的消息队列,由主线程来执行这些操作。 1. **创建子线程**: 在MFC工程中,可以使用`CWinThread`类的派生类来创建一个新的线程。在派生类的`...
在标题“子线程中修改状态栏信息”中,我们关注的是在非主线程(子线程)中更新UI元素,这里是状态栏。在Windows系统中,UI更新通常由主线程(也称为消息循环线程)处理,因为它们必须遵循消息泵的工作方式。这意味...
然而,直接在非UI线程中更新UI界面可能会引发程序崩溃或其他未定义行为。这是因为UI组件通常是线程不安全的,即它们的设计默认只允许在一个特定的线程(通常称为UI线程或主事件循环)中被访问和更新。 本文将详细...
3. 如果需要在子线程中更新UI,必须通过Handler、runOnUiThread或使用Android提供的AsyncTask等机制,将任务回调到主线程执行。 在给定的代码示例中,可以看到以下几个关键点: 1. 使用委托(Delegate)来定义多个...
2. 使用Handler:为了在子线程中更新UI,可以创建一个与主线程关联的Handler实例。在子线程中,创建Message,设置其目标为该Handler,然后调用sendMessage()方法将Message放入主线程的MessageQueue。主线程的Looper...