package com.artemzin.qualitymatters.ui.fragments; import android.os.Handler; import android.os.Looper; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import com.artemzin.qualitymatters.ApplicationModule; import com.artemzin.qualitymatters.QualityMattersApp; import javax.inject.Inject; import javax.inject.Named; @SuppressWarnings("PMD.AbstractClassWithoutAnyMethod") public abstract class BaseFragment extends Fragment { @Inject @Named(ApplicationModule.MAIN_THREAD_HANDLER) Handler mainThreadHandler; protected void runOnUiThreadIfFragmentAlive(@NonNull Runnable runnable) { if (Looper.myLooper() == Looper.getMainLooper() && isFragmentAlive()) { runnable.run(); } else { mainThreadHandler.post(() -> { if (isFragmentAlive()) { runnable.run(); } }); } } private boolean isFragmentAlive() { return getActivity() != null && isAdded() && !isDetached() && getView() != null && !isRemoving(); } @Override public void onDestroy() { QualityMattersApp.get(getContext()).applicationComponent().leakCanaryProxy().watch(this); super.onDestroy(); } }