0

例如,我尝试在单独的线程中做一些事情:

public void shareQuote(final Context context, final ArrayList<Quote> quotes, final int number) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
        Toast warningWindow = Toast.makeText(context, context.getString(R.string.shareWarning), Toast.LENGTH_SHORT);
    } else {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // Creates new intent for sharing
                Intent shareIntent = new Intent(Intent.ACTION_SEND);

                shareIntent.setType(SHARE_TYPE_TEXT);
                String subject = context.getString(R.string.quotes_author);
                String sharingQuote = "\"" + quotes.get(number).getText() + "\"" + "\n";
            }
        }).start();
    }

如果我想在新线程中做某事,为什么必须将最终对象发送到参数列表?

4

2 回答 2

3

因为匿名类在设计上只能访问final参数(和final局部变量)。

于 2013-11-10T16:29:51.553 回答
1

Java 有严格的范围规则。您的线程类是一个匿名类,这意味着在方法完成后它将失去外部范围。这意味着方法堆栈框架中的任何内容都将被删除。

当您添加关键字时,final这可以防止方法中的字段发生更改,并允许将该字段添加到内部类的堆栈框架和方法的堆栈框架中。如果该字段不是最终的,则无法完成,因为您可以更改它在您的方法中指向的位置,并且内部类不会意识到此更改。

于 2013-11-10T16:44:43.087 回答