所以我在理解(我认为)刷新 UI 的工作原理方面存在问题。我有一个底部导航栏的活动,其中包含 3 个加载片段的项目。每个片段都从互联网加载数据,因此我将这些数据下载到一个线程中,完成后我在 UI 线程上刷新我的 recyclerview。
但问题是当我在导航栏上选择一个项目时,当我立即选择另一个项目时,我的应用程序崩溃,因为数据下载完成并且 UI 线程正在尝试刷新 recyclerview 但我不再在分段
那么我怎样才能避免这种崩溃呢?
这是我的代码:
private void refreshRecyclerView() {
new Thread(new Runnable() {
@Override
public void run() {
predictionList = ComboBetHTMLParser.getPredictionList();
updateUI();
}
}).start();
}
private void updateUI() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
adapter = new PredictionAdapter(predictionList);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
});
}
编辑 :
这是错误日志:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' on a null object reference
at com.projects.morgan.kingwin.Fragments.SafeFragment.updateUI(SafeFragment.java:61)
at com.projects.morgan.kingwin.Fragments.SafeFragment.access$100(SafeFragment.java:20)
at com.projects.morgan.kingwin.Fragments.SafeFragment$1.run(SafeFragment.java:55)
at java.lang.Thread.run(Thread.java:764)
主Activity底部导航条码:
bottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener() {
@Override
public void onTabSelected(int position) {
displayOnSelectedScreen(position);
}
@Override
public void onTabUnselected(int position) {
Log.d("TEST", "onTabUnselected:" + position);
}
@Override
public void onTabReselected(int position) {
Log.d("TEST", "onTabReselected:");
}
});
private void displayOnSelectedScreen(int position) {
// Begin the transaction
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = null;
switch (position) {
case 0:
if (accueilFragment == null) {
accueilFragment = new AccueilFragment();
}
fragment = accueilFragment;
break;
case 1:
if (predictionsFragment == null) {
predictionsFragment = new PredictionsFragment();
}
fragment = predictionsFragment;
break;
case 2:
if (safeFragment == null) {
safeFragment = new SafeFragment();
}
fragment = safeFragment;
break;
}
ft.replace(R.id.content_frame,fragment).commit();
}
片段代码:
public class SafeFragment extends Fragment {
private List<Prediction> predictionList = new ArrayList<>();
private RecyclerView recyclerView;
private PredictionAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.recycler_view_pronos, container, false);
initRecyclerView(view);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (predictionList.size() == 0) {
refreshRecyclerView();
}
}
private void initRecyclerView(View view) {
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
adapter = new PredictionAdapter(predictionList);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
}
private void refreshRecyclerView() {
new Thread(new Runnable() {
@Override
public void run() {
predictionList = InternetData.getPredictionList();
updateUI();
}
}).start();
}
private void updateUI() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
adapter = new PredictionAdapter(predictionList);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
});
}
}