在 AsyncTaskLoader 中修改 class 属性时会发生什么
What happens when you modify class attributes in AsyncTaskLoader
当您尝试从 loadInBackground()
方法 modify/read 一个 class 属性时。发生什么了? android 是否在传递变量之前进行深拷贝?
loadInBackground()
中的修改实际上会改变 class 属性值吗?
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Void>
{
public List<String> some_array = new ArrayList();
public String some_string = "Hello world";
...
@Override
public Loader<Void> onCreateLoader(int id, Bundle args)
{
return new AsyncTaskLoader<Void>(MainActivity.this)
{
@Override
protected void onStartLoading()
{
forceLoad();
}
@Override
public Void loadInBackground()
{
some_array.add("some element");
some_string = "good bye";
}
};
}
@Override
public void onLoadFinished(Loader<Void> loader, Void data)
{
// what are the values of some_array and some_string now?
}
@Override
public void onLoaderReset(Loader<Void> loader)
{
}
}
好的,所以我测试了它,显然 Java 将数组的指针传递给后台线程。
因此,后台线程中的修改确实会更改 class 变量。然而,这应该避免,因为它是异步的——由于缺乏可预测性,它会很快变得非常糟糕。
相反,我只是将更改存储在一些临时数组中,然后再将它们合并回 onLoadFinished
当您尝试从 loadInBackground()
方法 modify/read 一个 class 属性时。发生什么了? android 是否在传递变量之前进行深拷贝?
loadInBackground()
中的修改实际上会改变 class 属性值吗?
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Void>
{
public List<String> some_array = new ArrayList();
public String some_string = "Hello world";
...
@Override
public Loader<Void> onCreateLoader(int id, Bundle args)
{
return new AsyncTaskLoader<Void>(MainActivity.this)
{
@Override
protected void onStartLoading()
{
forceLoad();
}
@Override
public Void loadInBackground()
{
some_array.add("some element");
some_string = "good bye";
}
};
}
@Override
public void onLoadFinished(Loader<Void> loader, Void data)
{
// what are the values of some_array and some_string now?
}
@Override
public void onLoaderReset(Loader<Void> loader)
{
}
}
好的,所以我测试了它,显然 Java 将数组的指针传递给后台线程。
因此,后台线程中的修改确实会更改 class 变量。然而,这应该避免,因为它是异步的——由于缺乏可预测性,它会很快变得非常糟糕。
相反,我只是将更改存储在一些临时数组中,然后再将它们合并回 onLoadFinished