java - Java线程中变量的作用域

标签 java android multithreading

考虑这个 fragment 。

private String global_s;

public void onClick(View v) {
global_s = "String";

  new Thread(new Runnable() {
    public void run() {
        final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");     
        ImageView mImageView = (ImageView) findViewById(R.id.imageview);
        mImageView.setImageBitmap(bitmap);

        final String local_s = global_s;
        TextView tv = (TextView) findViewById(R.id.textview);
        tv.setText(local_s);
        });
    }
  }).start();
}

线程结束后,位图引用是否仍然存在(不被垃圾收集器收集)?因为它是在 mImageView 上分配的。

另外,local_s 怎么样?它的引用会被替换为 global_s 引用吗?

最佳答案

bitmaplocal_s 都是局部变量,因此在 run() 结束后立即处理(想想毫秒)。然而,Bitmap 和 String 对象可能会作为实例字段存储在 ImageView 和 TextView 对象中,共享它们的生命周期(想想几秒)。

关于local_sglobal_s之间的链接:local_s捕获赋值时global_s的值但几乎没用,因为它会立即传递给 .setText() - 请注意,Java 始终按值传递,因此会立即创建另一个副本并将其传递给 .setText() > 可能会将其存储在一个实例字段中,该实例字段在绘制时读取以呈现文本。

关于java - Java线程中变量的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32979324/

相关文章:

java - WAS 8.5 的 WSCallHelper.jdbcCall XMLType 映射实现

Android:更改 Spannable String 中换行符的高度不起作用

java - java中的字符串格式化程序对于$%2$.2f意味着什么

c++ - QThread:如何使用 protected 静态函数

java - Spark : not understood behaviour when writing to parquet file - datatypes

java - 如何在 Eclipse 中为 Glassfish 服务器构建 .war 文件

java - Eclipse 中 Gradle 任务的 Stacktrace 选项

java - 在 SQLite 中使用 long 插入数据时出现问题始终返回 -1

java - 有什么不同?

c# - 是否可以在Parallel Foreach循环内使用局部变量(无需无意间重写以前的值)