summaryrefslogtreecommitdiffstats
path: root/src/android/jar/src/org/qtproject/qt/android/QtNative.java
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2023-11-14 11:47:30 +0200
committerAssam Boudjelthia <assam.boudjelthia@qt.io>2023-11-23 19:58:21 +0200
commit9d3b55b2a8211e76c9f01a135f37a4c914abcc3e (patch)
tree35b3d431a59ee487ebbbd7e215ba992376bbc209 /src/android/jar/src/org/qtproject/qt/android/QtNative.java
parentf6e5e52c84cebfbdb24df6aba92bc4b3c3e8fae4 (diff)
Android: use WeakReference for static activity/service objects
Wrap the activity and service static objects with a WeakReference to fix a potential memory leak warning. Task-number: QTBUG-118077 Change-Id: Ifafd137cc49ec5ea23d8425b6bd58b43573970b9 Reviewed-by: Tinja Paavoseppä <tinja.paavoseppa@qt.io>
Diffstat (limited to 'src/android/jar/src/org/qtproject/qt/android/QtNative.java')
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtNative.java55
1 files changed, 35 insertions, 20 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtNative.java b/src/android/jar/src/org/qtproject/qt/android/QtNative.java
index 17624fecff..47c40fff4d 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java
@@ -19,6 +19,7 @@ import android.view.ContextMenu;
import android.view.Menu;
import android.view.View;
+import java.lang.ref.WeakReference;
import java.security.KeyStore;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
@@ -31,9 +32,9 @@ import javax.net.ssl.X509TrustManager;
public class QtNative
{
- private static Activity m_activity = null;
+ private static WeakReference<Activity> m_activity = null;
private static boolean m_activityPaused = false;
- private static Service m_service = null;
+ private static WeakReference<Service> m_service = null;
public static final Object m_mainActivityMutex = new Object(); // mutex used to synchronize runnable operations
public static final String QtTAG = "Qt JAVA";
@@ -54,9 +55,7 @@ public class QtNative
public static boolean isStarted()
{
- boolean hasActivity = m_activity != null;
- boolean hasService = m_service != null;
- return m_started && (hasActivity || hasService);
+ return m_started && (isActivityValid() || isServiceValid());
}
@UsedFromNativeCode
@@ -73,14 +72,14 @@ public class QtNative
public static void setActivity(Activity qtMainActivity)
{
synchronized (m_mainActivityMutex) {
- m_activity = qtMainActivity;
+ m_activity = new WeakReference<>(qtMainActivity);
}
}
public static void setService(Service qtMainService)
{
synchronized (m_mainActivityMutex) {
- m_service = qtMainService;
+ m_service = new WeakReference<>(qtMainService);
}
}
@@ -88,23 +87,33 @@ public class QtNative
public static Activity activity()
{
synchronized (m_mainActivityMutex) {
- return m_activity;
+ return m_activity != null ? m_activity.get() : null;
}
}
+ public static boolean isActivityValid()
+ {
+ return m_activity != null && m_activity.get() != null;
+ }
+
@UsedFromNativeCode
public static Service service()
{
synchronized (m_mainActivityMutex) {
- return m_service;
+ return m_service != null ? m_service.get() : null;
}
}
+ public static boolean isServiceValid()
+ {
+ return m_service != null && m_service.get() != null;
+ }
+
@UsedFromNativeCode
public static Context getContext() {
- if (m_activity != null)
- return m_activity;
- return m_service;
+ if (isActivityValid())
+ return m_activity.get();
+ return service();
}
@UsedFromNativeCode
@@ -174,7 +183,13 @@ public class QtNative
if (!mime.isEmpty())
intent.setDataAndType(uri, mime);
- activity().startActivity(intent);
+ Activity activity = activity();
+ if (activity == null) {
+ Log.w(QtTAG, "openURL(): The activity reference is null");
+ return false;
+ }
+
+ activity.startActivity(intent);
return true;
} catch (Exception e) {
@@ -209,7 +224,7 @@ public class QtNative
synchronized (m_mainActivityMutex) {
final Looper mainLooper = Looper.getMainLooper();
final Handler handler = new Handler(mainLooper);
- final boolean active = (m_activity != null && !m_activityPaused) || m_service != null;
+ final boolean active = (isActivityValid() && !m_activityPaused) || isServiceValid();
if (!active || !handler.post(action))
m_lostActions.add(action);
}
@@ -219,9 +234,9 @@ public class QtNative
private static void runPendingCppRunnablesOnAndroidThread()
{
synchronized (m_mainActivityMutex) {
- if (m_activity != null) {
+ if (isActivityValid()) {
if (!m_activityPaused)
- m_activity.runOnUiThread(runPendingCppRunnablesRunnable);
+ m_activity.get().runOnUiThread(runPendingCppRunnablesRunnable);
else
runAction(runPendingCppRunnablesRunnable);
} else {
@@ -278,10 +293,10 @@ public class QtNative
@Override
public void run() {
quitQtAndroidPlugin();
- if (m_activity != null)
- m_activity.finish();
- if (m_service != null)
- m_service.stopSelf();
+ if (isActivityValid())
+ m_activity.get().finish();
+ if (isServiceValid())
+ m_service.get().stopSelf();
m_started = false;
}