以上方法是在 // 获取数据后更新 UI mActivity.runOnUiThread(() -> { } 中调用的
时间: 2024-03-17 13:45:46 浏览: 109
Android实现在子线程中更新Activity中UI的方法
那么您可以将获取数据后更新UI的代码也放在onAttach()方法之后的runOnUiThread()中执行,这样就可以确保Fragment已经附加到Activity中了,避免出现Fragment未附加到Context的问题。具体代码如下:
```
private Context mContext;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_route_result, container, false);
LinearLayout tab1 = view.findViewById(R.id.tab1);
LinearLayout tab2 = view.findViewById(R.id.tab2);
initTabView(tab1, mBNRoutePlanList.get(0));
initTabView(tab2, mBNRoutePlanList.get(1));
return view;
}
private void initTabView(LinearLayout layoutTab, BNRoutePlanItem bnRoutePlanItem) {
TextView prefer = layoutTab.findViewById(R.id.prefer);
prefer.setText(bnRoutePlanItem.getPusLabelName());
TextView time = layoutTab.findViewById(R.id.time);
time.setText(getString(R.string.route_result_pass_time, (int) bnRoutePlanItem.getPassTime() / 60));
TextView distance = layoutTab.findViewById(R.id.distance);
distance.setText(getString(R.string.route_result_distance_text, (int) bnRoutePlanItem.getLength() / 1000));
TextView trafficLight = layoutTab.findViewById(R.id.traffic_light);
trafficLight.setText(String.valueOf(bnRoutePlanItem.getLights()));
}
private void updateUI() {
mActivity.runOnUiThread(() -> {
LinearLayout tab1 = getView().findViewById(R.id.tab1);
LinearLayout tab2 = getView().findViewById(R.id.tab2);
initTabView(tab1, mBNRoutePlanList.get(0));
initTabView(tab2, mBNRoutePlanList.get(1));
});
}
```
这样,即使在获取数据后更新UI时出现了Fragment未附加到Context的问题,也可以保证在Fragment附加到Activity后再更新UI了,避免了出现异常。
阅读全文