Как я могу использовать StrictMode.noteSlowCall?

Я просто хочу использовать StrictMode.noteSlowCall . Я не знаю что делать. Сайт разработчика /androidxref не имеет достаточного объяснения.

Ниже мой код.

@Override
public void onCreate() {

    StrictMode.ThreadPolicy.Builder builder = new StrictMode.ThreadPolicy.Builder();
    builder.detectCustomSlowCalls();
    builder.penaltyLog();
    builder.penaltyDropBox();
    builder.penaltyDialog();
    builder.penaltyFlashScreen();

    StrictMode.setThreadPolicy(builder.build());

ниже другой файл...

public static BigInteger computeRecursivelyWithCache(int n)

{

    StrictMode.noteSlowCall("jheeTest CustomSlowCall");
    SparseArray<BigInteger> cache = new SparseArray<BigInteger>();
    return computeRecursivelyWithCache(n);
}

OnClickListener mAboutKeyboardImageOnClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        computeRecursivelyWithCache(5);

Я пытался эти коды. Но это не работает вообще. Даже когда я нажал кнопку, она не появляется в лог-файле или дропбоксе. Можете ли вы сказать мне, в чем проблема?

2 ответа

Из документации,

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

Используя этот StrictMode, вы также можете обнаружить медленные вызовы методов.

StrictMode.noteSlowCall("jheeTest CustomSlowCall");

Когда вы говорите "StrictMode.noteSlowCall", вы устанавливаете политику, сообщающую системе, чтобы она уведомляла вас, когда происходит медленное выполнение метода. Как уведомить, зависит от того, какое "наказание" вы установили.

Здесь "jheeTest CustomSlowCall" является TAG/ MSG для вас, чтобы определить, где произошло нарушение.

Когда вы запускаете свое приложение и когда происходит нарушение политики (в этой конкретной политике StrictMode обнаружил, что один из ваших методов выполнялся медленно), вы увидите журнал в вашем logcat, если вы указали punilLog()

Я симулировал медленный вызов метода в одном из моих приложений и использовал тег "Slow_Call_Method_1"

11-30 15:11:38.574 16892-16892/com.PackageName D/StrictMode: StrictMode policy violation; ~duration=251 ms: android.os.StrictMode$StrictModeCustomViolation: policy=65551 violation=8 msg=Slow_Call_Method_1
    at android.os.StrictMode$AndroidBlockGuardPolicy.onCustomSlowCall(StrictMode.java:1397)
    at android.os.StrictMode.noteSlowCall(StrictMode.java:2340)
    at com.PackageName.TinyDBHelper.init(TinyDBHelper.java:41)
    at com.PackageName.MyApplication.onCreate(MyApplication.java:77)

Смотрите сообщение.

Нарушение политики StrictMode; ~ длительность =251 мс: android.os.StrictMode$StrictModeCustomViolation: policy=65551 нарушение =8 мсг =Slow_Call_Method_1

Если вы добавили много методов для отслеживания, msg поможет вам определить, какой метод вызвал нарушение политики. В моем случае метод, для которого я установил TAG на "Slow_Call_Method_1", является тем, который нарушил политику

Чтобы ответить на ваш вопрос,

Даже если я нажал кнопку, она не появляется в лог-файле или дропбоксе.

Он не появляется в файле журнала, потому что система dint обнаруживает, что это медленный вызов - это означает, что метод dint запускается достаточно медленно, чтобы нарушение не удалось

Убедитесь, что вы установили все эти элементы StrictMode не в Application.onCreate, а в Activity.onCreate. Потому что есть ошибка.

Но в целом ваш код правильный. Вы строите политику с маской detectCustomSlowCalls. Затем вы помечаете свой медленный (тяжелый) метод вызовом StrictMode.noteSlowCall. Когда ваше приложение попытается вызвать этот медленный метод в потоке пользовательского интерфейса, вы узнаете об этом.

Эта вещь помогает вам быть уверенным, что вы не вызываете медленные методы в потоке пользовательского интерфейса.

Другие вопросы по тегам