【问题标题】:Is Use of getApplicationContext() considered Harmful?使用 getApplicationContext() 是否被认为是有害的?
【发布时间】:2014-04-03 18:14:53
【问题描述】:

昨天我读到使用 getApplicationContext() 有潜在危险。因此,代码如下:

Toast.makeText(getApplicationContext(), "You mashed the button, dude.", Toast.LENGTH_SHORT).show();

...应该改为:

Toast.makeText(MainActivity.this, "You mashed the button, dude.", Toast.LENGTH_SHORT).show();

(其中“MainActivity”是代码所在的类的名称)。

然而我看到很多包含getApplicationContext()的代码sn-ps,比如:

button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        _initTask = new InitTask();
        _initTask.execute( getApplicationContext() );
    }
});

...来自here。使用 <className>.this 而不是 getApplicationContext() 真的更可取吗?

更新

我显然仍然不了解这其中的微妙之处(或卑鄙之处);使用此代码:

Toast.makeText(GetVendorsTask.this, s[0], Toast.LENGTH_SHORT).show();

我得到这个编译错误消息:

错误:(156, 18) 错误: 没有找到适合 makeText(MainActivity.GetVendorsTask,String,int) 的方法 方法 Toast.makeText(Context,CharSequence,int) 不适用 (参数不匹配;MainActivity.GetVendorsTask 无法转换为 Context) 方法 Toast.makeText(Context,int,int) 不适用 (参数不匹配;MainActivity.GetVendorsTask 无法转换为 Context)

所以我将抱怨的代码行更改为:

Toast.makeText(MainActivity.this, s[0], Toast.LENGTH_SHORT).show();

...它可以工作(编译)。 MainActivity是.java文件中最外层的类(即命名为MainActivity.java);但GetVendorsTask 是最接近的类(那行代码在GetVendorsTask 类中)。明确一点,代码是:

public class MainActivity extends ActionBarActivity {

    . . .

    class GetVendorsTask extends AsyncTask<Context, String, SearchResponse>
    {
    . . .
        @Override
        protected void onProgressUpdate(String... s)
        {
            super.onProgressUpdate(s);
            //Toast.makeText(getApplicationContext(), s[0], Toast.LENGTH_SHORT).show(); <= "getApplicationContext()" might be null
            //Toast.makeText(GetVendorsTask.this, s[0], Toast.LENGTH_SHORT).show();
            Toast.makeText(MainActivity.this, s[0], Toast.LENGTH_SHORT).show();
        }

所以用“MainActivity”替换“GetVendorsTask”可以安抚野兽,但这是最好的方法吗?

更新 2

This 示例代码仅使用“this”代替其他可能性。

【问题讨论】:

标签: java android


【解决方案1】:

ApplicationContext 是一个单例类,无论您在 Application 中的哪个位置,都将始终返回相同的 Context 实例。换句话说,只要您的 Application 正在运行,Application Context 就会一直存在。

另一方面,将Activity 用于Context 将特定于Activity,它与Application Context 不同。例如,您可以使用Activity Context 来显示Dialog,但不能使用Application Context

Here 是一个更详细解释它的答案。

另外,我不能推荐this 发帖;当我阅读它时,它为我澄清了很多话题。

【讨论】:

    【解决方案2】:

    无论您在做什么,最好传递最低要求的Context。将应用程序上下文视为一种上帝对象可以暂时隐藏因滥用生命周期方法而引起的问题。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 2011-12-28
      • 1970-01-01
      • 2011-08-12
      • 2014-11-24
      • 2010-12-22
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多