4

我只想使用 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);

我试过这些代码。但它根本不起作用。即使我按下按钮,它也不会出现在日志文件或保管箱中。你能告诉我问题是什么吗?

4

2 回答 2

1

从文档中,

StrictMode 是一个开发人员工具,它可以检测您可能不小心做的事情,并将它们提请您注意,以便您修复它们。

使用此 StrictMode,您还可以检测慢速方法调用。

StrictMode.noteSlowCall("jheeTest CustomSlowCall");

当您说“StrictMode.noteSlowCall”时,您正在设置一个策略,告诉系统在发生缓慢的方法执行时通知您。如何通知取决于您设置的“惩罚”。

在这里,“jheeTest CustomSlowCall”是一个标签/消息,用于识别违规发生的位置。

当您运行您的应用程序并发生违反政策时(在此特定政策中,StrictMode 检测到您的一个方法执行缓慢),您将在您的 logcat 中看到一个日志,前提是您已经给出了 pinchLog()

我在我的一个应用程序中模拟了一个慢速方法调用,并使用了标签“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 政策;~duration=251 毫秒:android.os.StrictMode$StrictModeCustomViolation:策略=65551 违规=8 msg=Slow_Call_Method_1

如果添加了许多要跟踪的方法,则 msg 可以帮助您确定哪个方法导致了策略违规。就我而言,我将 TAG 设置为“Slow_Call_Method_1”的方法违反了政策

要回答你的问题,

即使我按下按钮,它也不会出现在日志文件或保管箱中。

它出现在日志文件中是因为系统检测到它是一个缓慢的调用 - 这意味着方法运​​行速度足够慢以至于违规失败

于 2018-11-30T10:08:06.570 回答
0

确保您设置所有这些 StrictMode 的东西不是在 Application.onCreate 中,而是在 Activity.onCreate 中。因为有一个bug

但总的来说,您的代码是正确的。您使用 detectCustomSlowCalls 掩码构建策略。然后你用调用 StrictMode.noteSlowCall 来标记你的慢(重)方法。当您的应用程序尝试在 UI 线程中调用此慢速方法时,您会知道它。

这个东西可以帮助你确保你不会在 UI 线程中调用慢速方法。

于 2018-09-12T19:54:00.437 回答