【问题标题】:What happens when you modify class attributes in AsyncTaskLoader在 AsyncTaskLoader 中修改类属性时会发生什么
【发布时间】:2017-09-30 19:19:30
【问题描述】:

当您尝试从loadInBackground() 方法修改/读取类属性时。发生什么了? android在传递变量之前会做深拷贝吗?

loadInBackground() 内部的修改真的会改变类属性值吗?

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)
    {

    }
}

【问题讨论】:

    标签: android android-asynctask asynctaskloader


    【解决方案1】:

    好的,所以我测试了它,显然 Java 将数组的指针传递给后台线程。

    因此,后台线程中的修改确实会更改类变量。但是应该避免这种情况,因为它是异步的 - 由于缺乏可预测性,它可能会变得非常糟糕。

    相反,我只是将更改存储在一些临时数组中,然后再将它们合并回onLoadFinished

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2012-01-31
      相关资源
      最近更新 更多