在安卓fragment中写了获取路线规划,BaiduNaviManagerFactory.getRoutePlanManager().routePlan(list, currentPrefer, bundle, handler); private final Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); switch (msg.what) { case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_START: mFlRetry.setVisibility(View.GONE); mLayoutTab0.setSelected(false); mLayoutTab1.setSelected(false); mLayoutTab2.setSelected(false); break; case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_SUCCESS: mFlRetry.setVisibility(View.GONE); mRlButton.setVisibility(View.VISIBLE); updateBtnText(currentPrefer); initData(); break; case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_FAILED: mFlRetry.setVisibility(View.VISIBLE); break; default: break; } } }; 以上代码中 路线规划成功 后执行了 initData()方法, 方法中获取了3Tab信息和路线详情 这是个耗时操作,如下代码 BNRoutePlanInfos routePlaneInfos = BaiduNaviManagerFactory.getRoutePlanManager() .getRoutePlanInfo(); 获取限行数据导致报错,空指针异常,代码如下:routePlaneInfos.getLimitInfo(); 会不会是我获取3Tab数据没有写在子线程中, 导致了空指针异常?因为这个initData是在handler的handleMessage中执行的,handler是主线程,是否是这个原因?请帮我修改一下以上问题
时间: 2024-02-01 08:14:47 浏览: 59
是的,很可能是因为你在主线程中执行了耗时操作导致了空指针异常。建议你将获取限行数据的代码放在子线程中进行,可以使用 Android 提供的 AsyncTask 类来实现。具体修改方法如下:
1. 将 initData() 方法中获取限行数据的代码放在一个新的方法 getLimitInfo() 中。
2. 在 getLimitInfo() 方法中,使用 AsyncTask 来执行获取限行数据的操作。例如:
```
private void getLimitInfo() {
new AsyncTask<Void, Void, BNRoutePlanInfos>() {
@Override
protected BNRoutePlanInfos doInBackground(Void... voids) {
return BaiduNaviManagerFactory.getRoutePlanManager().getRoutePlanInfo();
}
@Override
protected void onPostExecute(BNRoutePlanInfos routePlanInfos) {
if (routePlanInfos != null) {
// 在这里处理获取到的限行数据
routePlanInfos.getLimitInfo();
}
}
}.execute();
}
```
3. 在 initData() 方法中调用 getLimitInfo() 方法即可:
```
private void initData() {
// 获取3Tab信息和路线详情
// ...
// 获取限行数据
getLimitInfo();
}
```
这样修改后,应该就能够避免空指针异常了。
阅读全文