Android中通过AsyncTask从Activity向Fragment传数据遇空指针问题
问题分析与解决方案
核心问题1:广播发送时机错误
MainActivity中onPostExecute先发送广播,再创建并替换HomeFragment。此时广播发送时,HomeFragment还未完成初始化,广播接收器也未注册,导致广播完全没被Fragment接收到,categories始终为null。
核心问题2:Adapter初始化时数据源为null
HomeFragment在onCreateView中直接用未初始化的categories(此时为null)创建CategoryAdapter,调用getItemCount()时自然触发NullPointerException。
核心问题3:收到广播后未同步更新Adapter
即便广播被成功接收,仅给Fragment的categories变量赋值,但Adapter持有的还是最初的null数据源,没有同步更新,也未调用刷新方法通知列表更新。
修复步骤
步骤1:调整广播发送时机
在MainActivity的onPostExecute中,先完成Fragment的创建与替换,确保接收器已注册后再发送广播:
@Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); // 先创建并替换Fragment,保证接收器已注册 replaceFragment(new HomeFragment()); // 再发送广播传递数据 Intent intent = new Intent("com.android.mainapp"); intent.putExtra("categories", categories); manager.sendBroadcast(intent); }
步骤2:初始化Adapter时用空列表避免空指针
在HomeFragment的onCreateView中,先将categories初始化为空列表,再创建Adapter:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { initBroadCastReceiver(); // 初始化空列表,避免null传入Adapter if (categories == null) { categories = new ArrayList<>(); } categoryAdapter = new CategoryAdapter(categories, getContext()); View view = inflater.inflate(R.layout.fragment_home, container, false); recyclerView = view.findViewById(R.id.parent_rv); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setAdapter(categoryAdapter); return view; }
步骤3:收到广播后更新Adapter数据源并刷新
修改HomeFragment中的广播接收器,同步更新Adapter的数据源并触发列表刷新:
class MyBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ArrayList<Category> receivedCategories = (ArrayList<Category>) intent.getSerializableExtra("categories"); if (receivedCategories != null) { // 复用原有列表引用,避免重新创建导致Adapter数据源脱节 categories.clear(); categories.addAll(receivedCategories); // 通知Adapter数据已更新 categoryAdapter.notifyDataSetChanged(); } } }
额外注意:确保Category类实现Serializable接口
由于使用getSerializableExtra传递列表,Category类必须实现Serializable接口:
public class Category implements Serializable { // 类成员变量与方法 }
内容的提问来源于stack exchange,提问作者YOUSSEF
相关产品推荐
相关产品推荐

