public void show() {
if(mContext instanceof Activity) {
Activity activity = (Activity) mContext;
if (!activity.isFinishing() && !activity.isDestroyed()) {
dialog.show();
当您说“ ...”时,您已经正确地识别了问题。对于AlertDialog(),getApplicationContext()或getApplication()都不能作为Context接受,因为它引发了异常:'无法添加窗口-令牌null不适用一个应用程序'”
要创建一个对话框,您需要一个活动上下文或一个服务上下文 ,而不是一个应用程序上下文 (getApplicationContext()和getApplication()都返回一个应用程序上下文)。
这是获得活动上下文的方法 :
(1)在活动或服务中:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
(2)在一个片段中: AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
内存泄漏不是“ this”引用所固有的问题,“ this”引用是对象对其自身的引用(即,对用于存储对象数据的实际分配内存的引用)。 在已分配内存已超过其可用寿命后,垃圾收集器(GC)无法释放的所有已分配内存都会发生这种情况。
大多数情况下,当变量超出范围时,GC将回收内存。 但是,当变量持有的对象(例如“ x”)的引用仍然存在时,即使对象已超过其使用寿命,也会发生内存泄漏。 因此,只要“ x”保留对它的引用,分配的内存就将丢失,因为只要该内存仍在被引用,GC 就不会释放该内存。 有时,由于对已分配内存的引用链 ,内存泄漏不明显。 在这种情况下,除非删除了对该内存的所有引用,否则GC不会释放该内存。
为防止内存泄漏,请检查代码中是否存在逻辑错误,这些逻辑错误会导致分配的内存被“此”(或其他引用)无限期地引用。 切记还要检查链引用。 以下是一些可用于帮助您分析内存使用情况并查找那些讨厌的内存泄漏的工具:
我在一个片段中使用ProgressDialog ,并且在将getActivity().getApplicationContext()作为构造函数参数传递时遇到此错误。 将其更改为getActivity().getBaseContext()也不起作用。
对我getActivity()的解决方案是传递getActivity() ; 即
progressDialog = new ProgressDialog(getActivity());
在活动中只需使用:
MyActivity.this
在片段中:
getActivity();
***** Kotlin版本*****
您应该传递this@YourActivity而不是applicationContext或baseContext
这是我为应用程序解决的相同错误的方法:
创建对话框后添加以下行:
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
您无需获取上下文。 如果要在当前弹出的对话框上弹出另一个对话框,这将特别有用。 或者在不方便获取上下文的情况下。
希望这可以帮助您开发应用程序。
如果您的对话框是在适配器上创建的:
将活动传递给适配器构造函数:
adapter = new MyAdapter(getActivity(),data);
在适配器上接收:
public MyAdapter(Activity activity, List<Data> dataList){
this.activity = activity;
现在您可以在Builder上使用
AlertDialog.Builder alert = new AlertDialog.Builder(activity);
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(getWindow().getDecorView().getRootView().getContext());
builder.setTitle("Confirm");
builder.setMessage("Are you sure you want delete your old account?");
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//Do nothing but close the dialog
dialog.dismiss();
builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//Do nothing
dialog.dismiss();
android.support.v7.app.AlertDialog alert = builder.create();
alert.show();
只需使用以下内容:
对于JAVA用户
如果您使用活动-> AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new AlertDialog.Builder(your_activity.this);
如果使用片段-> AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
对于KOTLIN用户
如果您使用活动-> val builder = AlertDialog.Builder(this)
val builder = AlertDialog.Builder(this@your_activity.this)
如果您使用片段-> val builder = AlertDialog.Builder(activity!!)
您的对话框不应是“需要上下文的长期对象”。 该文档令人困惑。 基本上,如果您执行以下操作:
static Dialog sDialog;
(注意静态 )
然后在某处的活动中
sDialog = new Dialog(this);
您很可能在轮换期间泄漏了原始活动,或者可能破坏活动的类似活动。 (除非您在onDestroy中进行清理,但是在那种情况下,您可能不会使Dialog对象成为静态对象)
对于某些数据结构,将其设置为静态并基于应用程序的上下文是有意义的,但通常不适用于与UI相关的事物,例如对话框。 所以像这样:
Dialog mDialog;
mDialog = new Dialog(this);
很好,不应泄漏该活动,因为mDialog不是静态的,它将随该活动一起释放。
代替getApplicationContext() ,只需使用ActivityName.this 。
我的活动试图创建一个AlertContext,它需要一个Context作为参数。 如果我使用,这可以按预期工作: AlertDialog.Builder builder = new Alert
Android应用开发时,逻辑接口使用单元测试,比较方便验证接口的正确性。有些接口需要context对象,可能依赖的包中使用了getApplicationContext,因此在传入context时,一般传入ApplicationContext,依赖包中也就不会出错了。
单元测试中获取context方法如下:
// 非ApplicationContext,依赖包可能会出错
mContext = In...
自定义一个Application类,然后在activity类中通过getApplication()获得一个Application的实例:
myApp = (MyApp) getApplication();
但是运行程序的时候一直报类类型转换异常,
原因是自定义的Application必须在清单文件中注册声明
<application
android:name="co
Application简介
Application和Actovotu,Service一样是android框架的一个系统组件,在启动app的时候都需要初始化某些资源,监听App的各种状态,如:锁屏,横竖屏切换、进入后台等。
1、Application的特点
默认是全局单例
Application的生命周期就等于这个程序的生命周期
初始化资源:App启动时会在Application的onCreate()方法中初始化一些全局资源,系统配置,三方sdk等。例如日志框架,内存溢出检测
数据传递:由于A
Application extends ContextWapper
所以当我们在调用Application的 getApplicationContext时 实际上调用的是ContextWapper的getApplicationContext 方法如下
from ContextWapper.java
@Override
public Context ge...