在线程中使用QSettings,最好是用QApplication.invokeLater( new Runnable(){});线程方法,这是经验谈哦
QThreadPool.globalInstance().start(new QRunnable(){});
内直接使用QSettings,在应用程序退出时报:
QObjects can only be implicitly garbage collected when owned by a QThread, native resource ('' [QSettings]) is leaked
信息
在线程内调用静态的QSettings对像或方法时会报如下类似信息:
QObject used from outside its own thread, object=QSettings(0x3a0e700) , objectThread=Thread[main,5,main], currentThread=Thread[Thread-2,5,main]
at com.trolltech.qt.GeneratorUtilities.threadCheck(GeneratorUtilities.java:56)
at com.trolltech.qt.core.QSettings.value(QSettings.java:429)
at com.trolltech.qt.core.QSettings.value(QSettings.java:425)
at com.ViessBuden.OO.util.SettingsManager.getXmppHost(SettingsManager.java:91)
at com.ViessBuden.OO.LoginDialog.getServerName(LoginDialog.java:650)
at com.ViessBuden.OO.LoginDialog.access$2(LoginDialog.java:649)
at com.ViessBuden.OO.LoginDialog$LoginPanel.login(LoginDialog.java:340)
at com.ViessBuden.OO.LoginDialog$LoginPanel$1.run(LoginDialog.java:309)
在QThread或Thread线程内使用QSettings类,也会报异常
总结,在QApplication.invokeLater( new Runnable(){});线程内使用QSettings类是最好的方法