package com.camnter.newlife.utils.context; import android.os.Handler; import android.os.Looper; import android.support.annotation.NonNull; import android.util.Log; import java.lang.reflect.Method; /** * https://github.com/kaedea/Feya/blob/master/Application/Feya/src/main/java/me/kaede/feya/context/AndroidHacks.java */ @SuppressWarnings("WeakerAccess") public class AndroidHacks { private static final String TAG = "Applications"; private static Object sActivityThread; @NonNull public static Object getActivityThread() { if (sActivityThread == null) { synchronized (AndroidHacks.class) { if (sActivityThread == null) { sActivityThread = getActivityThreadFromUIThread(); if (sActivityThread != null) { return sActivityThread; } if (Looper.getMainLooper() == Looper.myLooper()) { sActivityThread = getActivityThreadFromUIThread(); } else { Handler handler = new Handler(Looper.getMainLooper()); synchronized (AndroidHacks.class) { handler.post(new Runnable() { @Override public void run() { sActivityThread = getActivityThreadFromUIThread(); synchronized (AndroidHacks.class) { AndroidHacks.class.notify(); } } }); try { AndroidHacks.class.wait(); } catch (InterruptedException e) { Log.w(TAG, "Waiting notification from UI thread error.", e); } } } } } } return sActivityThread; } private static Object getActivityThreadFromUIThread() { Object activityThread = null; try { Method method = Class.forName("android.app.ActivityThread") .getMethod("currentActivityThread"); method.setAccessible(true); activityThread = method.invoke(null); } catch (final Exception e) { Log.w(TAG, "Failed to get ActivityThread from ActivityThread#currentActivityThread. " + "In some case, this method return null in worker thread.", e); } return activityThread; } }