我如何使用StrictMode.noteSlowCall?

时间:2016-09-20 08:35:59

标签: android android-strictmode

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

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

2 个答案:

答案 0 :(得分:1)

从文档中,

  

StrictMode是一个开发人员工具,它可以检测到您可能偶然执行的操作并引起您的注意,以便您进行修复。

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

StrictMode.noteSlowCall("jheeTest CustomSlowCall");

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

在这里,“ jheeTest CustomSlowCall”是一个TAG / msg,可让您标识发生冲突的位置。

在运行应用程序时,当发生违反策略的情况(在此特定策略中,StrictMode检测到您的一种方法执行缓慢)时,如果您已给定刑罚Log(),您将在logcat中看到一条日志。

我在一个应用中模拟了一个缓慢的方法调用,并使用了标记“ 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”的方法就是违反该政策的方法

要回答您的问题,

  

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

由于系统dint检测到它是一个慢速调用,因此dint出现在日志文件上-意味着dint方法运行得足够慢,以致于违规失败

答案 1 :(得分:0)

确保没有在Application.onCreate中而是在Activity.onCreate中设置所有这些StrictMode内容。因为有一个bug

但是总的来说,您的代码是正确的。您可以使用detectCustomSlowCalls掩码构建策略。然后,通过调用StrictMode.noteSlowCall标记慢速(繁重)方法。 当您的应用程序尝试在UI线程中调用此慢速方法时,您将对此有所了解。

这件事可以帮助您确保不要在UI线程中调用慢速方法。