【问题标题】:How to solve Memory Leaks?如何解决内存泄漏?
【发布时间】:2018-02-17 08:33:26
【问题描述】:

我不想使用@SuppressLint("StaticFieldLeak")。如何解决正确的方法呢? (Do not place Android context classes in static fields)

“数据连接”

public class DataConnect {

    public static DialogPlus dialog;

    public static void showDialog(Context context) {
        dialog = DialogPlus.newDialog(context)
                .setContentHolder(new ViewHolder(R.layout.content))
                .create();
                //
        dialog.show();
        // 
    }
}

然后,当我运行 MainActivity 时,java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.orhanobut.dialogplus.DialogPlus.isShowing()' on a null object reference。如何正确调用另一个类的对话框变量?

“MainActivit.java”

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    @Override
    public void onBackPressed() {
        try {
            if (dialog.isShowing()) {
                dialog.dismiss();
            } else {
                super.onBackPressed();
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

  • 你不应该有一个静态的 DialogPlus 和任何上下文子类

标签: java android memory-leaks


【解决方案1】:

在保存 android 活动/片段或任何视图时,切勿使用静态,因为您会泄漏它们。

如果你想在帮助类中创建你的对话框,你可以这样做:

public static DialogPlus showDialog(Context context) {
        DialogPlus dialog = DialogPlus.newDialog(context)
                .setContentHolder(new ViewHolder(R.layout.content))
                .create();
                //
        dialog.show();
        return dialog;

    }

在你的活动中你可以做的某处:

public class MainActivity extends AppCompatActivity {
    private DialogPlus dialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dialog = DataConnect.showDialog(this);
    }


    @Override
    public void onBackPressed() {
            if (dialog != null && dialog.isShowing()) {
                dialog.dismiss();
            } else {
                super.onBackPressed();
            }
    }
}

【讨论】:

  • @ClapaLucian我不想显示对话框 onCreate()。因为当用户单击 Button 时会调用 showDialog。
  • 嗯,你可以在任何地方添加它,为了简单起见,我只是在创建时添加了它:)
  • 如果不添加dialog = DataConnect.showDialog(this);,则对话框不工作。即使是 dialog.isShowing(),它也不会关闭 - 直接转到 super.onBackPressed()
  • @StevenPhyo 你必须这样做才能引用你的对话框,否则在 onBackPressed 你的对话框将为空,这就是为什么不工作
猜你喜欢
  • 2015-06-28
  • 1970-01-01
  • 2021-11-18
  • 2018-04-11
  • 2020-04-07
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多