例如,我尝试在单独的线程中执行某些操作:
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();
}
如果我想在新线程中执行某些操作,为什么必须将最终对象发送到参数列表?
答案 0 :(得分:3)
因为anonymous classes只能访问final
个参数(和final
局部变量),所以设计。
答案 1 :(得分:1)
Java有严格的范围规则。您的线程类是一个匿名类,这意味着它将在方法完成后丢失外部作用域。这意味着将删除方法堆栈框架中的任何内容。
当您添加关键字final
时,这会阻止方法中的字段更改,并允许将该字段添加到内部类的堆栈框架和方法的堆栈框架中。如果该字段不是最终字段,则无法完成,因为您可以更改它在方法中指向的位置,并且内部类不会意识到此更改。