Я отслеживаю проблему, которая вызывает у моего приложения некоторое мерцание при перетаскивании касания на экране.Проблема с Math.min на Android-приложении
Проблема, похоже, связана с Math.min
, что не приводит к правильному результату в некоторых случаях.
mPointerPos.mPos.x = Math.min(mPointerPos.mPos.x, 0.9f * mDragStartPos.x);
Я изменил вызов функции условным заявлением, но проблема не устранена.
float min = 0.9f * mDragStartPos.x;
Log.w("!", "" + mPointerPos.mPos.x + " " + min);
mPointerPos.mPos.x = mPointerPos.mPos.x < min ? mPointerPos.mPos.x : min;
Log.w("!\t->", "" + mPointerPos.mPos.x);
Выход:
01-12 08:36:34.133 26229-26229 W/!: -0.3032546
01-12 08:36:34.134 26229-26229 W/!: -0.3032546 -1.4999999
01-12 08:36:34.134 26229-26229 W/! ->: -1.4999999
01-12 08:36:34.147 26229-26229 W/!: -0.2417283
01-12 08:36:34.148 26229-26229 W/!: -0.2417283 -1.4999999
01-12 08:36:34.152 26229-26229 W/! ->: -1.5933207
01-12 08:36:34.158 26229-26229 W/!: -0.19270718
01-12 08:36:34.159 26229-26229 W/!: -0.19270718 -1.4999999
01-12 08:36:34.159 26229-26229 W/! ->: -1.4999999
В строке 6 я ожидал увидеть -1.4999999, то есть минимальное значение между -0.2417283 и -1.4999999, вместо этого я получаю -1.5933207
Есть ли что-то, что мне не хватает? mPointerPos.mPos
и mDragStartPos
относятся к типу android.graphics.PointF
Держу пари, что это проблема многопоточности – Selvin
постарайтесь сделать ее максимально простой. Поэтому для этих операций используйте только локальные переменные: 'float x = mDragStartPos.x; 'и работать с' x' вместо глобальных или переменных параметров. Или синхронизировать код. Если вы этого не сделаете, 'mPointerPos.mPos.x' может быть изменен другим потоком, пока вы выполняете свои вычисления. –