aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorMenny Even Danan <menny@evendanan.net>2015-06-03 01:35:27 +0000
committerMenny Even Danan <menny@evendanan.net>2015-06-03 01:35:27 +0000
commit34e2be945ea5fe877711ffc1985e43102e26b4c8 (patch)
tree61a61b7a07e50802b6b6053e8dd7f0fc0794bcce /base
parent010a0cb6a592827669b23e2a735bd23008e8272a (diff)
downloadAnySoftKeyboard-34e2be945ea5fe877711ffc1985e43102e26b4c8.tar.gz
AnySoftKeyboard-34e2be945ea5fe877711ffc1985e43102e26b4c8.tar.bz2
moving JAVA implementations to JNI libs
Diffstat (limited to 'base')
-rw-r--r--base/build.gradle22
-rw-r--r--base/src/main/java/com/anysoftkeyboard/base/utils/GCUtils.java62
2 files changed, 62 insertions, 22 deletions
diff --git a/base/build.gradle b/base/build.gradle
index e11e5f5cc..d160358bf 100644
--- a/base/build.gradle
+++ b/base/build.gradle
@@ -1,21 +1,4 @@
-buildscript {
- repositories {
- mavenLocal()
- mavenCentral()
- maven {
- url 'https://oss.sonatype.org/content/repositories/snapshots/'
- }
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
- classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0'
- }
-}
-
-apply plugin: 'android-sdk-manager'
apply plugin: 'com.android.library'
-apply plugin: 'pmd'
-apply plugin: 'jacoco'
android {
compileSdkVersion 22
@@ -27,11 +10,6 @@ android {
versionCode 1
versionName "1.0"
}
- buildTypes {
- release {
- minifyEnabled false
- }
- }
}
dependencies {
diff --git a/base/src/main/java/com/anysoftkeyboard/base/utils/GCUtils.java b/base/src/main/java/com/anysoftkeyboard/base/utils/GCUtils.java
new file mode 100644
index 000000000..d22c72d4c
--- /dev/null
+++ b/base/src/main/java/com/anysoftkeyboard/base/utils/GCUtils.java
@@ -0,0 +1,62 @@
+package com.anysoftkeyboard.base.utils;
+
+import android.text.format.DateUtils;
+import android.util.Log;
+
+public class GCUtils {
+ private static final int GC_TRY_COUNT = 2;
+ // GC_TRY_LOOP_MAX is used for the hard limit of GC wait,
+ // GC_TRY_LOOP_MAX should be greater than GC_TRY_COUNT.
+ private static final int GC_TRY_LOOP_MAX = 5;
+ private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS;
+ private static final GCUtils sInstance = new GCUtils();
+ private int mGCTryCount = 0;
+
+ public static GCUtils getInstance() {
+ return sInstance;
+ }
+
+ public boolean performOperationWithMemRetry(String TAG, MemRelatedOperation operation, boolean failWithException) {
+ reset();
+
+ boolean retry = true;
+ while (retry) {
+ try {
+ operation.operation();
+ return true;
+ } catch (OutOfMemoryError e) {
+ Log.w(TAG, "WOW! No memory for operation... I'll try to release some.");
+ retry = tryGCOrWait(TAG, e);
+ if (!retry && failWithException) throw e;
+ }
+ }
+ return false;
+ }
+
+ private void reset() {
+ mGCTryCount = 0;
+ }
+
+ private boolean tryGCOrWait(String metaData, Throwable t) {
+ if (mGCTryCount % GC_TRY_COUNT == 0) {
+ System.gc();
+ }
+ if (mGCTryCount > GC_TRY_LOOP_MAX) {
+ return false;
+ } else {
+ mGCTryCount++;
+ try {
+ Thread.sleep(GC_INTERVAL);
+ return true;
+ } catch (InterruptedException e) {
+ Log.e(metaData, "Sleep was interrupted.");
+ //ImeLogger.logOnException(metaData, t);
+ return false;
+ }
+ }
+ }
+
+ public interface MemRelatedOperation {
+ void operation();
+ }
+}