Android: Fix freeze when showing Devices settings category

It looks like executing blocking process from inside
AndroidDevice::createWidget(), which is executed from
show event, may interferre with GUI.

The fix is to execute the blocking process with a delay.

Fixes: QTCREATORBUG-31912
Change-Id: Id5a065364e0992c31e586547fc520f76a89f95cf
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-11-04 15:53:43 +01:00
parent 5bcbde9b23
commit e0bb7b839b
2 changed files with 11 additions and 11 deletions

View File

@@ -295,16 +295,14 @@ AndroidDeviceWidget::AndroidDeviceWidget(const IDevice::Ptr &device)
setLayout(formLayout);
formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
if (!dev->isValid())
if (dev->avdName().isEmpty())
return;
formLayout->addRow(Tr::tr("Device name:"), new QLabel(dev->displayName()));
formLayout->addRow(Tr::tr("Device type:"), new QLabel(dev->deviceTypeName()));
const QString serialNumber = dev->serialNumber();
const QString printableSerialNumber = serialNumber.isEmpty() ? Tr::tr("Unknown")
: serialNumber;
formLayout->addRow(Tr::tr("Serial number:"), new QLabel(printableSerialNumber));
QLabel *serialNumberLabel = new QLabel;
formLayout->addRow(Tr::tr("Serial number:"), serialNumberLabel);
const QString abis = dev->supportedAbis().join(", ");
formLayout->addRow(Tr::tr("CPU architecture:"), new QLabel(abis));
@@ -327,6 +325,14 @@ AndroidDeviceWidget::AndroidDeviceWidget(const IDevice::Ptr &device)
const QString openGlStatus = dev->openGLStatus();
formLayout->addRow(Tr::tr("OpenGL status:"), new QLabel(openGlStatus));
}
// See QTCREATORBUG-31912 why this needs to be delayed.
QTimer::singleShot(0, this, [serialNumberLabel, dev] {
const QString serialNumber = dev->serialNumber(); // This executes a blocking process.
const QString printableSerialNumber = serialNumber.isEmpty() ? Tr::tr("Unknown")
: serialNumber;
serialNumberLabel->setText(printableSerialNumber);
});
}
QString AndroidDeviceWidget::dialogTitle()
@@ -522,11 +528,6 @@ bool AndroidDevice::canHandleDeployments() const
return true;
}
bool AndroidDevice::isValid() const
{
return !serialNumber().isEmpty() || !avdName().isEmpty();
}
QString AndroidDevice::serialNumber() const
{
const QString serialNumber = extraData(Constants::AndroidSerialNumber).toString();

View File

@@ -31,7 +31,6 @@ public:
bool canHandleDeployments() const;
bool isValid() const;
QString serialNumber() const;
QString avdName() const;
int sdkLevel() const;