通常我会这样做:
@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;
}
(我在这里从记忆中走出来但是应该抓住它的要点)。
但是,如果我将列表/适配器初始化包装在新的线程调用中,有时在创建视图时结果为空,或者在某些情况下根据正在进行的操作引发错误。
我的订单是否错误或者其他什么?我应该在哪里申请该帖子?
答案 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线程中运行的任何方法都应尽可能少地工作。
加载器是提供异步数据加载的方式。
您可能会发现this回答有用。