【问题标题】:AlertDialog.Builder declaration inside or outside inner AsyncTask class?内部 AsyncTask 类内部或外部的 AlertDialog.Builder 声明?
【发布时间】:2014-03-18 16:07:11
【问题描述】:

考虑一下这个AsyncTask内部活动MyActivity

private class MyTask extends AsyncTask<Void, Void, Void> {

    private ProgressDialog progressDialog;
    private AlertDialog.Builder alertDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = ProgressDialog.show(MyActivity.this, "MyApp", "Working...");
    }

    @Override
    protected Void doInBackground(Void... params) {
        // elaborate...
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        progressDialog.dismiss();

        alertDialog = new AlertDialog.Builder(MyActivity);
        alertDialog.setMessage("Done !");
        alertDialog.show();
    }
}

如果我声明会发生什么

private ProgressDialog progressDialog;
private AlertDialog.Builder alertDialog;

AsyncTask之外,在活动范围内?

真的一样吗(对于内存泄漏和其他内部 Java 行为)?一个比另一个更好吗?

【问题讨论】:

  • 我会避免保存对构建器的引用...如果您想记住 AlertDialog,请保存 alertDialog.show() 的引用;

标签: java android memory-leaks android-asynctask


【解决方案1】:

不太清楚你所说的“相同”是什么意思。但是,如果您正在谈论progressDialog 和alertDialog 的范围,那么答案肯定是否定的。变量属于声明它的类。

基本上,progressDialog 和 alertDialog 实际需要的只是对 Context 实例的引用(在您的情况下是“MyActivity”),以便实例化和显示它,因此它们的创建位置无关紧要因为该 Context 对象可用。

希望对你有帮助。

【讨论】:

  • 谢谢,我完善了我的问题。我说的是内存泄漏和内部 Java 行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2010-09-27
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多