使用getApplicationContext()是否有害?

时间:2014-04-03 18:14:53

标签: java android

昨天我读到使用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()的代码片段,例如:

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

...来自here。是否真的更喜欢使用<className&gt; .this over 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无法转换为上下文)

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

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();
        }

所以替换&#34; GetVendorsTask&#34;与&#34; MainActivity&#34;安抚野兽,但这是最好的方式吗?

更新2

This示例代码简单地使用&#34;这个&#34;代替其他可能性。

2 个答案:

答案 0 :(得分:5)

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

另一方面,使用Activity Context将特定于Activity,并且与Application Context不同。例如,您可以使用Activity Context来显示Dialog,而不是Application Context

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

另外,我不能推荐this足够的帖子;当我读到它时,它为我澄清了这个主题。

答案 1 :(得分:1)

最好为您所做的任何事情传递最低要求Context。将应用程序上下文视为一种上帝对象可以暂时隐藏因滥用生命周期方法而产生的问题。