是否有一种方法来获得静态方法内的当前上下文实例?
我正在寻找这种方式,因为我讨厌保存'Context'实例每次它改变。
是否有一种方法来获得静态方法内的当前上下文实例?
我正在寻找这种方式,因为我讨厌保存'Context'实例每次它改变。
当前回答
芬兰湾的科特林:
清单:
<application android:name="MyApplication">
</application>
MyApplication.kt
class MyApplication: Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
companion object {
lateinit var instance: MyApplication
private set
}
}
然后,您可以通过MyApplication.instance访问该属性
其他回答
在Kotlin中,将Context/App Context放在同伴对象中仍然会产生警告,不要将Android Context类放在静态字段中;这是一个内存泄漏(也破坏了即时运行)
或者如果你使用这样的东西:
companion object {
lateinit var instance: MyApp
}
这只是愚弄lint不发现内存泄漏,App实例仍然可以产生内存泄漏,因为Application类及其后代是一个Context。
或者,你可以使用功能界面或功能属性来帮助你获得应用上下文。
简单地创建一个对象类:
object CoreHelper {
lateinit var contextGetter: () -> Context
}
或者你可以使用nullable type更安全:
object CoreHelper {
var contextGetter: (() -> Context)? = null
}
在你的App类中添加这一行:
class MyApp: Application() {
override fun onCreate() {
super.onCreate()
CoreHelper.contextGetter = {
this
}
}
}
在你的manifest中声明应用名。MyApp
<application
android:name=".MyApp"
当你想获取上下文时,只需调用:
CoreHelper.contextGetter()
// or if you use the nullable version
CoreHelper.contextGetter?.invoke()
希望能有所帮助。
我认为你需要一个getAppContext()方法的主体:
public static Context getAppContext()
return MyApplication.context;
芬兰湾的科特林:
清单:
<application android:name="MyApplication">
</application>
MyApplication.kt
class MyApplication: Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
companion object {
lateinit var instance: MyApplication
private set
}
}
然后,您可以通过MyApplication.instance访问该属性
我刚刚发布了一个基于jquery的Android框架,名为Vapor API,旨在简化应用开发。
中心$ facade类维护了一个WeakReference(链接到Ethan Nicholas关于此的出色Java博客文章)到当前Activity上下文,您可以通过调用:
$.act()
WeakReference在不阻止垃圾回收回收原始对象的情况下维护引用,因此不应该存在内存泄漏问题。
当然,缺点是您要承担$.act()可能返回null的风险。我还没有遇到过这种情况,所以这可能只是一个最小的风险,值得一提。
如果你不使用VaporActivity作为你的Activity类,你也可以手动设置上下文:
$.act(Activity);
此外,许多Vapor API框架固有地使用这种存储上下文,这可能意味着如果您决定使用该框架,您根本不需要自己存储它。请查看该网站以获取更多信息和示例。
我希望这对你有所帮助:)
我使用单例设计模式的一个变体来帮助我做到这一点。
import android.app.Activity;
import android.content.Context;
public class ApplicationContextSingleton {
private static Activity gContext;
public static void setContext( Activity activity) {
gContext = activity;
}
public static Activity getActivity() {
return gContext;
}
public static Context getContext() {
return gContext;
}
}
然后调用ApplicationContextSingleton。setContext(this);在我的activity.onCreate()和ApplicationContextSingleton。setContext(null);在onDestroy ();