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

Unity调用Android Fragment函数时API空指针错误的解决方法

问题分析与修复方案

错误根源

你直接通过new AndroidJavaObject("com.Myproject.ui.fragment.GameFragment")创建Fragment实例的方式是错误的。Fragment是Android的生命周期组件,必须通过Android的FragmentManager进行创建/挂载,才能触发它的生命周期方法(如onCreate、onViewCreated),进而完成内部依赖(比如你的RestAPIInterface实例)的初始化。直接new出来的Fragment不会执行任何生命周期逻辑,导致API接口实例为null,调用时触发空指针异常。


修复方案

方案一:将API逻辑移至独立工具类(推荐)

把Retrofit初始化和API调用逻辑从Fragment中剥离,放到独立的单例工具类中,避免依赖Fragment的生命周期:

  1. Android端创建工具类
public class GameDataApiManager {
    private static GameDataApiManager sInstance;
    private RestAPIInterface mRestAPI;

    private GameDataApiManager() {
        // 初始化Retrofit与API接口
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("你的API基础地址")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        mRestAPI = retrofit.create(RestAPIInterface.class);
    }

    public static synchronized GameDataApiManager getInstance() {
        if (sInstance == null) {
            sInstance = new GameDataApiManager();
        }
        return sInstance;
    }

    public void createData(int num) {
        CreateData request = new CreateData();
        // 填充request参数
        mRestAPI.doUserDataRequestWithNumberOfData(num, request).enqueue(new Callback<你的返回模型>() {
            @Override
            public void onResponse(Call<你的返回模型> call, Response<你的返回模型> response) {
                // 调用Unity回调:UnityPlayer.UnitySendMessage("接收回调的GameObject名称", "回调方法名", 返回数据字符串);
                UnityPlayer.UnitySendMessage("GameManager", "OnDataCreated", new Gson().toJson(response.body()));
            }

            @Override
            public void onFailure(Call<你的返回模型> call, Throwable t) {
                UnityPlayer.UnitySendMessage("GameManager", "OnDataCreateFailed", t.getMessage());
            }
        });
    }
}
  1. Unity端调用工具类
// 获取单例实例
AndroidJavaClass apiManagerClass = new AndroidJavaClass("com.Myproject.utils.GameDataApiManager");
AndroidJavaObject apiManager = apiManagerClass.CallStatic<AndroidJavaObject>("getInstance");
// 调用API方法
apiManager.Call("createData", 1);

方案二:获取已挂载的Fragment实例

如果你的GameFragment已经在当前Activity中加载显示,可以通过Activity获取已初始化的Fragment实例:

  1. Android端Activity添加获取Fragment的方法
public GameFragment getGameFragment() {
    return (GameFragment) getSupportFragmentManager().findFragmentById(R.id.game_fragment_container);
}
  1. Unity端获取Fragment并调用方法
// 获取当前Unity绑定的Activity
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
// 获取已初始化的Fragment
AndroidJavaObject gameFragment = currentActivity.Call<AndroidJavaObject>("getGameFragment");
if (gameFragment != null) {
    gameFragment.Call("createData", 1);
} else {
    Debug.LogError("当前Activity中未找到GameFragment实例");
}

额外检查点

  • 确保GameFragment中的RestAPIInterface实例是在onCreate等生命周期方法中初始化,而非Fragment的构造函数(Fragment构造函数应保持空实现)。
  • 如果使用了Dagger等依赖注入框架,直接new的Fragment无法获取注入的依赖,必须通过FragmentManager创建才能正常注入。

内容的提问来源于stack exchange,提问作者chronoschou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:00:54