我有以下代码:
@Override
public void onReceive(Context arg0, Intent arg1)
{
String blabla = "blabla";
Handler connectionStatusHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//Do something with blabla;
}
};
}
不幸的是,由于java处理闭包的方式,它不起作用,我不能让blabla最终。
所以我想也许我可以做这样的事情
@Override
public void onReceive(Context arg0, Intent arg1)
{
String blabla = "blabla";
Handler connectionStatusHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//Do something with localBlabla;
}
public String localBlabla;
};
connectionStatusHandler.localBlabla = blabla;
}
但它也不起作用,因为Handler没有名为localBlabla
的成员。
从技术上讲,我可以创建一个从Handler继承的非匿名类,并在那里添加我想要的成员,但在我这样做之前,我想也许有人有一些技巧来解决它并将非最终数据传递给内部类
由于
答案 0 :(得分:2)
快速而肮脏的黑客是使用只有一个值的final String[]
。这样,该值仍然是可变的,但您可以在任何需要final
:
@Override
public void onReceive(Context arg0, Intent arg1)
{
final String[] blabla = new String[] { "blabla" };
Handler connectionStatusHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
blabla[0] = "new string value";
}
};
blabla[0] = "i'm still editable";
}
这最初是由想要一个类似于Reference
或c ++指针的包装类的人想到的,但却懒得写出完整的界面。
我建议不要在任何你打算使用的代码中使用它。如果你只写一些样板,你可以提出更清晰,更清晰的选择。
答案 1 :(得分:0)
你可以创建一个新类,称之为MyConnectionStatusHandler
,并为它创建一个公共构造函数来获取消息并存储它。然后使用new MyConnectionStatusHandler(blabla)
代替new Handler(){...}
。
修改强> 我之前尝试过这样的事情,它要么不起作用,要么变得一团糟。创建非匿名类可能是您的最佳选择。