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

时间:2013-11-10 16:27:30

标签: java android multithreading

例如,我尝试在单独的线程中执行某些操作:

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

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

2 个答案:

答案 0 :(得分:3)

因为anonymous classes只能访问final个参数(和final局部变量),所以设计。

答案 1 :(得分:1)

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

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