【发布时间】: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”代替其他可能性。
【问题讨论】:
-
嘿 Clay,应用程序上下文存在危险的原因是什么?你有文章的链接吗?