完整log如下:
03-04 04:36:02.685 E/AndroidRuntime( 4724): FATAL EXCEPTION: AsyncTask #1
03-04 04:36:02.685 E/AndroidRuntime( 4724): Process: com.android.systemui, PID: 4724
03-04 04:36:02.685 E/AndroidRuntime( 4724): java.lang.RuntimeException: Can't create handler inside thread Thread[AsyncTask #1,5,main] that has not called Looper.prepare()
03-04 04:36:02.685 E/AndroidRuntime( 4724): at android.os.Handler.<init>(Handler.java:227)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at android.os.Handler.<init>(Handler.java:129)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at android.view.ViewRootImpl$ViewRootHandler.<init>(ViewRootImpl.java:4848)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:5160)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:719)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:399)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:110)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at com.android.systemui.assist.AssistManager$3.onConfigChanged(AssistManager.java:183)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at com.android.systemui.assist.AssistManager.<init>(AssistManager.java:221)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at com.android.systemui.assist.AssistManager_Factory.provideInstance(AssistManager_Factory.java:107)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at com.android.systemui.assist.AssistManager_Factory.get(AssistManager_Factory.java:70)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at com.android.systemui.assist.AssistManager_Factory.get(AssistManager_Factory.java:17)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard$16(StatusBar.java:2662)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard$16$StatusBar(Unknown Source:0)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at com.android.systemui.statusbar.phone.-$$Lambda$StatusBar$fPMIOsYMhFXVKHESAjUObpcgeJM.run(Unknown Source:10)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
03-04 04:36:02.685 E/AndroidRuntime( 4724): at java.lang.Thread.run(Thread.java:923)
产生上述的代码如下:
public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching,
final Callback callback, int flags) {
if (onlyProvisioned && !mDeviceProvisionedController.isDeviceProvisioned()) return;
final boolean afterKeyguardGone = mActivityIntentHelper.wouldLaunchResolverActivity(
intent, mLockscreenUserManager.getCurrentUserId());
Runnable runnable = () -> {
mAssistManagerLazy.get().hideAssist();
intent.setFlags(
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(flags);
int result = ActivityManager.START_CANCELED;
ActivityOptions options = new ActivityOptions(getActivityOptions(
null /* remoteAnimation */));
options.setDisallowEnterPictureInPictureWhileLaunching(
disallowEnterPictureInPictureWhileLaunching);
public Handler(@Nullable Callback callback, boolean async) {
if (FIND_POTENTIAL_LEAKS) {
final Class<? extends Handler> klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) == 0) {
Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
klass.getCanonicalName());
}
}
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread " + Thread.currentThread()
+ " that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
造成上述的原因是
AsyncTask 中new Handler 不成功。修改方案
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
mAssistManagerLazy.get().hideAssist();
}
};
public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching,
final Callback callback, int flags) {
if (onlyProvisioned && !mDeviceProvisionedController.isDeviceProvisioned()) return;
final boolean afterKeyguardGone = mActivityIntentHelper.wouldLaunchResolverActivity(
intent, mLockscreenUserManager.getCurrentUserId());
Runnable runnable = () -> {
//mAssistManagerLazy.get().hideAssist();
mHandler.post(mRunnable);