TimerTask и Timer: поведение переменной экземпляра

Функция:

public float simpleSimilarity(String u, String v) {
    String[] a = u.split(" ");
    String[] b = v.split(" ");

    long correct = 0;
    int minLen = Math.min(a.length, b.length);

    for (int i = 0; i < minLen; i++) {
        String aa = a[i];
        String bb = b[i];
        int minWordLength = Math.min(aa.length(), bb.length());

        for (int j = 0; j < minWordLength; j++) {
            if (aa.charAt(j) == bb.charAt(j)) {
                correct++;
            }
        }
    }

    return (float) (((double) correct) / Math.max(u.length(), v.length()));
}

Тест:

String a = "This is the first string.";

String b = "this is not 1st string!";

// for exact string comparison, use .equals

boolean exact = a.equals(b);

// For similarity check, there are libraries for this
// Here I'll try a simple example I wrote

float similarity = simple_similarity(a,b);
0
задан ashishdhiman2007 17 January 2019 в 10:15
поделиться

3 ответа

Вы должны отменить таймер в onDestroy, позвонив по timerTask.cancel();.

0
ответ дан Varun 17 January 2019 в 10:15
поделиться

Откройте файл манифеста Android и измените тег Activity следующим образом

android:configChanges="keyboardHidden|orientation"
.
0
ответ дан Kannan panneer selvam 17 January 2019 в 10:15
поделиться

По существу, у вас есть утечка памяти, которая вызвана не отмененным предыдущим Timer и сохранением ссылки на переменную count. Вот почему, даже когда Activity уничтожается, ваш старый таймер все еще увеличивает старую переменную count, и когда активность воссоздается, появится новый объект Timer и новая переменная count. Поэтому вы увидите 2 счетчика одновременно.

Решение - отменить таймер, когда активность уничтожена:

@Override
protected void onDestroy() {
    super.onDestroy();
    timer.cancel();
}

Если вы хотите узнать больше об утечках памяти, вы можете проверить эту статью.

0
ответ дан Natig Babayev 17 January 2019 в 10:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: