子线程能创建handler吗

子线程可以创建Handler,但直接使用new Thread会导致Loopers的空指针异常。Google的HandlerThread解决了这个问题,它确保在子线程启动时初始化Looper,避免空指针异常并允许在子线程中处理消息。创建Handler遵循创建Looper、Handler和调用loop的步骤。使用HandlerThread可以安全地创建非主线程Handler并执行耗时任务。
摘要由CSDN通过智能技术生成

这是之前碰到的一个面试题,准确的来说,子线程是可以创建hanlder的,但是如果你直接使用new thread来创建,代码会报loop的空指针错误,原因如下文,但是,Google给我们提供了HandlerThread,我们当然也可以利用HandlerThread中的思想在newThread里面实现子线程创建handler而不报错

默认情况下,ActivityThread类为我们创建的了主线程的Looper和消息队列,所以当你创建Handler之后发送消息的时候,消息的轮训和handle都是在ui线程进行的。这种情况属于子线程给主线程发消息,通知主线程更新ui...等,那么反过来,怎么才能让主线程给子线程发消息,通知子线程做一些耗时逻辑??

Android的消息机制遵循三个步骤:
    1  创建当前线程的Looper  
    2  创建当前线程的Handler 
    3  调用当前线程Looper对象的loop方法

那么如果我想创建非主线程的Handler并且发送消息、处理消息,这一系列的操作我们应该怎么办?直接上代码:

public class ChildThreadHandlerActivity extends Activity {
    private MyThread childThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler);

        childThread = new MyThread();
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用PyQt6写多线程控制程序的例,其中线程可以控制进度条: ```python import sys from PyQt6.QtCore import * from PyQt6.QtGui import * from PyQt6.QtWidgets import * class Worker(QThread): progress_update = pyqtSignal(int) def __init__(self, parent=None): super().__init__(parent) def run(self): for i in range(101): self.progress_update.emit(i) # 发送进度信号 self.msleep(50) class MainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("多线程控制程序") self.setGeometry(100, 100, 300, 200) self.progress_bar = QProgressBar(self) self.progress_bar.setGeometry(50, 50, 200, 30) start_button = QPushButton("开始", self) start_button.setGeometry(50, 100, 100, 30) start_button.clicked.connect(self.start_worker) stop_button = QPushButton("停止", self) stop_button.setGeometry(150, 100, 100, 30) stop_button.clicked.connect(self.stop_worker) self.worker = None def start_worker(self): self.worker = Worker(self) self.worker.progress_update.connect(self.update_progress) # 接收进度信号 self.worker.start() def stop_worker(self): if self.worker is not None: self.worker.quit() self.worker.wait() def update_progress(self, value): self.progress_bar.setValue(value) if __name__ == '__main__': app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec()) ``` 在这个例中,我们创建了一个继承自QThread的Worker类,该类负责执行一些耗时任务,并且在执行过程中发送进度信号。主窗口中有一个进度条和两个按钮,分别用于开始和停止任务。当点击开始按钮时,我们创建一个Worker实例,并将其进度信号连接到主窗口的update_progress槽函数。当Worker执行过程中发送进度信号时,主窗口接收到信号并更新进度条的值。当点击停止按钮时,我们停止Worker的执行。 注意,在PyQt6中,我们需要使用progress_update = pyqtSignal(int)语句来声明一个进度信号,并使用self.progress_update.emit(i)语句在Worker中发送信号。另外,在连接信号和槽函数时,我们需要使用worker.progress_update.connect(self.update_progress)语句,而不是worker.connect(self.update_progress)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值