blob: d660cc99406c3c2af363734c142d52a74d7ef1dc [file] [log] [blame]
// Copyright (c) 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);
}
});
}
}