在AsyncTaskLoader

时间:2017-09-30 19:19:30

标签: android android-asynctask asynctaskloader

当您尝试从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)
    {

    }
}

1 个答案:

答案 0 :(得分:0)

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

因此,后台线程中的修改会改变类变量。然而,这应该避免,因为它的异步 - 由于缺乏可预测性,它可以真正快速地变得非常讨厌。

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