此错误只在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