我的活动正在尝试创建一个AlertDialog,它需要一个上下文作为参数。如果我使用:

AlertDialog.Builder builder = new AlertDialog.Builder(this);

然而,我对使用“this”作为上下文持怀疑态度,因为即使在屏幕旋转这样简单的操作中,Activity被破坏和重新创建时,也有可能发生内存泄漏。来自Android开发者博客的相关文章:

There are two easy ways to avoid context-related memory leaks. The most obvious one is to avoid escaping the context outside of its own scope. The example above showed the case of a static reference but inner classes and their implicit reference to the outer class can be equally dangerous. The second solution is to use the Application context. This context will live as long as your application is alive and does not depend on the activities life cycle. If you plan on keeping long-lived objects that need a context, remember the application object. You can obtain it easily by calling Context.getApplicationContext() or Activity.getApplication().

但是对于AlertDialog(), getApplicationContext()或getApplication()都不能作为上下文,因为它会抛出异常:

"无法添加窗口-令牌null不是用于应用程序"

参考文献:1、2、3等。

所以,这真的应该被认为是一个“bug”,因为我们被正式建议使用Activity.getApplication(),但它并没有像宣传的那样发挥作用?

Jim


当前回答

在活动中单击按钮显示一个对话框

Dialog dialog = new Dialog(MyActivity.this);

为我工作。

其他回答

在查看API之后,您可以将您的activity或getActivity(如果您位于片段中)传递给对话框,然后在返回方法中使用dialog.dismiss()强制清理它以防止泄漏。

虽然它没有明确说明我知道的任何地方,似乎你在OnClickHandlers中传递回对话框只是为了这样做。

在我的案例中:

this.getContext();

如果你正在使用一个片段并使用AlertDialog/Toast消息,那么在context参数中使用getActivity()。

像这样

ProgressDialog pdialog;
pdialog = new ProgressDialog(getActivity());
pdialog.setCancelable(true);
pdialog.setMessage("Loading ....");
pdialog.show();

我认为它也可能发生,如果你试图显示一个对话框从一个线程,这不是主UI线程。

在这种情况下使用runOnUiThread()。

只需使用以下语句:

Java用户

如果你正在使用活动——> AlertDialog。生成器生成器=新的AlertDialog.Builder(这个);

OR

AlertDialog。生成器生成器= new AlertDialog.Builder(your_activity.this);

如果你正在使用fragment——> AlertDialog。生成器生成器= new AlertDialog.Builder(getActivity());

对于kotlin用户

如果你正在使用活动——> val builder = AlertDialog.Builder(这个)

OR

val builder = AlertDialog.Builder(this@your_activity.this)

如果你正在使用fragment——> val builder = AlertDialog.Builder(activity!!)