// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.base; import android.content.Context; import java.lang.ref.WeakReference; import java.util.concurrent.Callable; /** * Holds a WeakReference to Context to allow it to be GC'd. * Also provides utility functions to getSystemService from the UI or any * other thread (may return null, if the Context has been nullified). */ public class WeakContext { private static WeakReference<Context> sWeakContext; public static void initializeWeakContext(final Context context) { sWeakContext = new WeakReference<Context>(context); } public static Context getContext() { return sWeakContext.get(); } // Returns a system service. May be called from any thread. // If necessary, it will send a message to the main thread to acquire the // service, and block waiting for it to complete. // May return null if context is no longer available. public static Object getSystemService(final String name) { final Context context = sWeakContext.get(); if (context == null) { return null; } if (ThreadUtils.runningOnUiThread()) { return context.getSystemService(name); } return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Object>() { @Override public Object call() { return context.getSystemService(name); } }); } }