You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:40:40