如何将信息传递给java中的匿名类?

时间:2014-11-27 14:43:10

标签: java android

我有以下代码:

@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继承的非匿名类,并在那里添加我想要的成员,但在我这样做之前,我想也许有人有一些技巧来解决它并将非最终数据传递给内部类

由于

2 个答案:

答案 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(){...}

修改 我之前尝试过这样的事情,它要么不起作用,要么变得一团糟。创建非匿名类可能是您的最佳选择。