在Android生命周期内从后台线程加载数据的正确方法是什么?

时间:2016-11-15 20:41:35

标签: android sql database multithreading android-recyclerview

通常我会这样做:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //initialize variables, set values from argument bundle, etc
    List<SomeObject> list = someIntenseDataLoadingProcess();
    adapter = new Adapter(list);
}

@Nullable
@Override
public void onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.some_layout, container, false);
    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(getLinearLayoutManager());
    recyclerView.setAdapter(adapter);
    return view;
}

(我在这里从记忆中走出来但是应该抓住它的要点)。

但是,如果我将列表/适配器初始化包装在新的线程调用中,有时在创建视图时结果为空,或者在某些情况下根据正在进行的操作引发错误。

我的订单是否错误或者其他什么?我应该在哪里申请该帖子?

2 个答案:

答案 0 :(得分:0)

您可以使用AsyncTask在后台工作,然后在UI线程上执行代码:

final List<SomeObject> list;
        new AsyncTask<Void,Void,Void>(){
            @Override
            protected Void doInBackground(Void... voids) {
            list[0] = someIntenseDataLoadingProcess();
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                recyclerView.setAdapter(new Adapter(list[0]));
            }
        };

答案 1 :(得分:0)

  

我的订单有错吗?

您从someIntenseDataLoadingProcess()方法调用onCreate(),这是一种不好的做法,因为它会阻止UI线程。在UI线程中运行的任何方法都应尽可能少地工作。

加载器是提供异步数据加载的方式。

查看Loaders guides

您可能会发现this回答有用。