StrictMode引发的惨案

此错误只在api28的设备上出现,错误信息:

2019-06-28 11:55:43.742 10055-10055/com.goldze.component D/StrictMode: StrictMode policy violation; ~duration=2 ms: android.os.strictmode.DiskReadViolation
        at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1504)
        at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:251)
        at java.io.File.exists(File.java:815)
        at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:605)
        at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:596)
        at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:552)
        at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:747)
        at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:400)
        at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:174)
        at me.goldze.mvvmhabit.utils.SPUtils.<init>(SPUtils.java:47)
        at me.goldze.mvvmhabit.utils.SPUtils.getInstance(SPUtils.java:40)
        at me.goldze.mvvmhabit.utils.SPUtils.getInstance(SPUtils.java:27)
        at com.goldze.user.ui.viewmodel.MeViewModel.initData(MeViewModel.java:43)
        at com.goldze.user.ui.viewmodel.MeViewModel.onCreate(MeViewModel.java:39)
        at me.goldze.mvvmhabit.base.IBaseViewModel_LifecycleAdapter.callMethods(IBaseViewModel_LifecycleAdapter.java:28)
        at android.arch.lifecycle.SingleGeneratedAdapterObserver.onStateChanged(SingleGeneratedAdapterObserver.java:35)
        at android.arch.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
        at android.arch.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:180)
        at me.goldze.mvvmhabit.base.BaseFragment.initViewDataBinding(BaseFragment.java:103)
        at me.goldze.mvvmhabit.base.BaseFragment.onViewCreated(BaseFragment.java:73)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-06-28 11:55:43.742 10055-10055/com.goldze.component D/AndroidRuntime: Shutting down VM
2019-06-28 11:55:43.744 10055-10055/com.goldze.component E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.goldze.component, PID: 10055
    java.lang.RuntimeException: StrictMode ThreadPolicy violation
        at android.os.StrictMode$AndroidBlockGuardPolicy.onThreadPolicyViolation(StrictMode.java:1705)
        at android.os.StrictMode$AndroidBlockGuardPolicy.lambda$handleViolationWithTimingAttempt$0(StrictMode.java:1619)
        at android.os.-$$Lambda$StrictMode$AndroidBlockGuardPolicy$9nBulCQKaMajrWr41SB7f7YRT1I.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: android.os.strictmode.DiskReadViolation
        at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1504)
        at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:251)
        at java.io.File.exists(File.java:815)
        at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:605)
        at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:596)
        at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:552)
        at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:747)
        at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:400)
        at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:174)
        at me.goldze.mvvmhabit.utils.SPUtils.<init>(SPUtils.java:47)
        at me.goldze.mvvmhabit.utils.SPUtils.getInstance(SPUtils.java:40)
        at me.goldze.mvvmhabit.utils.SPUtils.getInstance(SPUtils.java:27)
        at com.goldze.user.ui.viewmodel.MeViewModel.initData(MeViewModel.java:43)
        at com.goldze.user.ui.viewmodel.MeViewModel.onCreate(MeViewModel.java:39)
        at me.goldze.mvvmhabit.base.IBaseViewModel_LifecycleAdapter.callMethods(IBaseViewModel_LifecycleAdapter.java:28)
        at android.arch.lifecycle.SingleGeneratedAdapterObserver.onStateChanged(SingleGeneratedAdapterObserver.java:35)
        at android.arch.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
        at android.arch.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:180)
        at me.goldze.mvvmhabit.base.BaseFragment.initViewDataBinding(BaseFragment.java:103)
        at me.goldze.mvvmhabit.base.BaseFragment.onViewCreated(BaseFragment.java:73)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:873) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
2019-06-28 11:55:43.745 10055-10055/com.goldze.component E/CustomActivityOnCrash: App has crashed, executing CustomActivityOnCrash's UncaughtExceptionHandler
    java.lang.RuntimeException: StrictMode ThreadPolicy violation
        at android.os.StrictMode$AndroidBlockGuardPolicy.onThreadPolicyViolation(StrictMode.java:1705)
        at android.os.StrictMode$AndroidBlockGuardPolicy.lambda$handleViolationWithTimingAttempt$0(StrictMode.java:1619)
        at android.os.-$$Lambda$StrictMode$AndroidBlockGuardPolicy$9nBulCQKaMajrWr41SB7f7YRT1I.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: android.os.strictmode.DiskReadViolation
        at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1504)
        at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:251)
        at java.io.File.exists(File.java:815)
        at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:605)
        at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:596)
        at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:552)
        at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:747)
        at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:400)
        at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:174)
        at me.goldze.mvvmhabit.utils.SPUtils.<init>(SPUtils.java:47)
        at me.goldze.mvvmhabit.utils.SPUtils.getInstance(SPUtils.java:40)
        at me.goldze.mvvmhabit.utils.SPUtils.getInstance(SPUtils.java:27)
        at com.goldze.user.ui.viewmodel.MeViewModel.initData(MeViewModel.java:43)
        at com.goldze.user.ui.viewmodel.MeViewModel.onCreate(MeViewModel.java:39)
        at me.goldze.mvvmhabit.base.IBaseViewModel_LifecycleAdapter.callMethods(IBaseViewModel_LifecycleAdapter.java:28)
        at android.arch.lifecycle.SingleGeneratedAdapterObserver.onStateChanged(SingleGeneratedAdapterObserver.java:35)
        at android.arch.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
        at android.arch.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:180)
        at me.goldze.mvvmhabit.base.BaseFragment.initViewDataBinding(BaseFragment.java:103)
        at me.goldze.mvvmhabit.base.BaseFragment.onViewCreated(BaseFragment.java:73)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:873) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

使用步骤:

	1、Application
	StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectAll()//监测所有内容
            .penaltyLog()//违规对log日志
            .penaltyDeath()//违规Crash
            .build());
      
      2、SPUtils
      public final class SPUtils {
	    private static Map<String, SPUtils> sSPMap = new HashMap<>();
	    private SharedPreferences sp;
	    /**
	     * 获取SP实例
	     *
	     * @return {@link SPUtils}
	     */
	    public static SPUtils getInstance() {
	        return getInstance("");
	    }
	
	    /**
	     * 获取SP实例
	     *
	     * @param spName sp名
	     * @return {@link SPUtils}
	     */
	    public static SPUtils getInstance(String spName) {
	        if (isSpace(spName)) spName = "spUtils";
	        SPUtils sp = sSPMap.get(spName);
	        if (sp == null) {
	            sp = new SPUtils(spName);
	            sSPMap.put(spName, sp);
	        }
	        return sp;
	    }
	
	    private SPUtils(final String spName) {
	        sp = Utils.getContext().getSharedPreferences(spName, Context.MODE_PRIVATE);
	    }
	
	    /**
	     * SP中写入String
	     *
	     * @param key 键
	     * @param value 值
	     */
	    public void put(@NonNull final String key, @NonNull final String value) {
	        sp.edit().putString(key, value).apply();
	    }
	
	    /**
	     * SP中读取String
	     *
	     * @param key 键
	     * @return 存在返回对应值,不存在返回默认值{@code ""}
	     */
	    public String getString(@NonNull final String key) {
	        return getString(key, "");
	    }
	
	    /**
	     * SP中读取String
	     *
	     * @param key 键
	     * @param defaultValue 默认值
	     * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
	     */
	    public String getString(@NonNull final String key, @NonNull final String defaultValue) {
	        return sp.getString(key, defaultValue);
	    }
	
	    /**
	     * SP中写入int
	     *
	     * @param key 键
	     * @param value 值
	     */
	    public void put(@NonNull final String key, final int value) {
	        sp.edit().putInt(key, value).apply();
	    }
	
	    /**
	     * SP中读取int
	     *
	     * @param key 键
	     * @return 存在返回对应值,不存在返回默认值-1
	     */
	    public int getInt(@NonNull final String key) {
	        return getInt(key, -1);
	    }
	
	    /**
	     * SP中读取int
	     *
	     * @param key 键
	     * @param defaultValue 默认值
	     * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
	     */
	    public int getInt(@NonNull final String key, final int defaultValue) {
	        return sp.getInt(key, defaultValue);
	    }
	
	    /**
	     * SP中写入long
	     *
	     * @param key 键
	     * @param value 值
	     */
	    public void put(@NonNull final String key, final long value) {
	        sp.edit().putLong(key, value).apply();
	    }
	
	    /**
	     * SP中读取long
	     *
	     * @param key 键
	     * @return 存在返回对应值,不存在返回默认值-1
	     */
	    public long getLong(@NonNull final String key) {
	        return getLong(key, -1L);
	    }
	
	    /**
	     * SP中读取long
	     *
	     * @param key 键
	     * @param defaultValue 默认值
	     * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
	     */
	    public long getLong(@NonNull final String key, final long defaultValue) {
	        return sp.getLong(key, defaultValue);
	    }
	
	    /**
	     * SP中写入float
	     *
	     * @param key 键
	     * @param value 值
	     */
	    public void put(@NonNull final String key, final float value) {
	        sp.edit().putFloat(key, value).apply();
	    }
	
	    /**
	     * SP中读取float
	     *
	     * @param key 键
	     * @return 存在返回对应值,不存在返回默认值-1
	     */
	    public float getFloat(@NonNull final String key) {
	        return getFloat(key, -1f);
	    }
	
	    /**
	     * SP中读取float
	     *
	     * @param key 键
	     * @param defaultValue 默认值
	     * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
	     */
	    public float getFloat(@NonNull final String key, final float defaultValue) {
	        return sp.getFloat(key, defaultValue);
	    }
	
	    /**
	     * SP中写入boolean
	     *
	     * @param key 键
	     * @param value 值
	     */
	    public void put(@NonNull final String key, final boolean value) {
	        sp.edit().putBoolean(key, value).apply();
	    }
	
	    /**
	     * SP中读取boolean
	     *
	     * @param key 键
	     * @return 存在返回对应值,不存在返回默认值{@code false}
	     */
	    public boolean getBoolean(@NonNull final String key) {
	        return getBoolean(key, false);
	    }
	
	    /**
	     * SP中读取boolean
	     *
	     * @param key 键
	     * @param defaultValue 默认值
	     * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
	     */
	    public boolean getBoolean(@NonNull final String key, final boolean defaultValue) {
	        return sp.getBoolean(key, defaultValue);
	    }
	
	    /**
	     * SP中写入String集合
	     *
	     * @param key 键
	     * @param values 值
	     */
	    public void put(@NonNull final String key, @NonNull final Set<String> values) {
	        sp.edit().putStringSet(key, values).apply();
	    }
	
	    /**
	     * SP中读取StringSet
	     *
	     * @param key 键
	     * @return 存在返回对应值,不存在返回默认值{@code Collections.<String>emptySet()}
	     */
	    public Set<String> getStringSet(@NonNull final String key) {
	        return getStringSet(key, Collections.<String>emptySet());
	    }
	
	    /**
	     * SP中读取StringSet
	     *
	     * @param key 键
	     * @param defaultValue 默认值
	     * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
	     */
	    public Set<String> getStringSet(@NonNull final String key, @NonNull final Set<String> defaultValue) {
	        return sp.getStringSet(key, defaultValue);
	    }
	
	    /**
	     * SP中获取所有键值对
	     *
	     * @return Map对象
	     */
	    public Map<String, ?> getAll() {
	        return sp.getAll();
	    }
	
	    /**
	     * SP中是否存在该key
	     *
	     * @param key 键
	     * @return {@code true}: 存在<br>{@code false}: 不存在
	     */
	    public boolean contains(@NonNull final String key) {
	        return sp.contains(key);
	    }
	
	    /**
	     * SP中移除该key
	     *
	     * @param key 键
	     */
	    public void remove(@NonNull final String key) {
	        sp.edit().remove(key).apply();
	    }
	
	    /**
	     * SP中清除所有数据
	     */
	    public void clear() {
	        sp.edit().clear().apply();
	    }
	
	    private static boolean isSpace(final String s) {
	        if (s == null) return true;
	        for (int i = 0, len = s.length(); i < len; ++i) {
	            if (!Character.isWhitespace(s.charAt(i))) {
	                return false;
	            }
	        }
	        return true;
	    }
	}

处理方式,在api28不使用StrictMode

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值