Android 跨页面传参数 查询结果为空

问题

笔者进行Android 项目开发,使用Intent进行页面跳转并传递参数,跳转页面查询所传递结果为空。

详细问题

控制台输出:

2024-01-21 23:41:56.738 1219-1219/com.example.assistingagriculture E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.assistingagriculture, PID: 1219
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.assistingagriculture.entity.PestsAndDiseases.getCategory()' on a null object reference
        at com.example.assistingagriculture.activity.four_functional_pages_for_the_elderly.SolvingAndPreventingTheCausesOfDiseasesAndPestsActivity$GetPestsAndDiseasesTask.onPostExecute(SolvingAndPreventingTheCausesOfDiseasesAndPestsActivity.java:152)
        at com.example.assistingagriculture.activity.four_functional_pages_for_the_elderly.SolvingAndPreventingTheCausesOfDiseasesAndPestsActivity$GetPestsAndDiseasesTask.onPostExecute(SolvingAndPreventingTheCausesOfDiseasesAndPestsActivity.java:114)
        at android.os.AsyncTask.finish(AsyncTask.java:794)
        at android.os.AsyncTask.access$900(AsyncTask.java:199)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:811)
        at android.os.Handler.dispatchMessage(Handler.java:117)
        at android.os.Looper.loopOnce(Looper.java:205)
        at android.os.Looper.loop(Looper.java:293)
        at android.app.ActivityThread.loopProcess(ActivityThread.java:9934)
        at android.app.ActivityThread.main(ActivityThread.java:9923)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240)

跳转核心代码:

// 封装的页面跳转函数
    private void navigateToSolvingAndPreventingTheCausesOfDiseasesAndPestsActivity(Context context, String category) {
        Intent intent = new Intent(context, SolvingAndPreventingTheCausesOfDiseasesAndPestsActivity.class);
        startActivity(intent);
        // 在Intent中携带数据,key为"category",value为你要传递的具体数值
        intent.putExtra("category", category);
        // 确保调用finish(),以便在启动新Activity后关闭当前Activity(可选)
        finish();
    }

接收核心代码:

// 从Intent中获取传递的数据
        Intent intent = getIntent();
        if (intent.hasExtra("category")) {
            // 在这里使用获取到的数据 categoryValue
            categoryValue = intent.getStringExtra("category");
        }

解决方案

将intent.putExtra()方法提至startActivity(intent)方法之前
即:

// 封装的页面跳转函数
    private void navigateToSolvingAndPreventingTheCausesOfDiseasesAndPestsActivity(Context context, String category) {
        Intent intent = new Intent(context, SolvingAndPreventingTheCausesOfDiseasesAndPestsActivity.class);
        // 在Intent中携带数据,key为"category",value为你要传递的具体数值
        intent.putExtra("category", category);
        startActivity(intent);
        // 确保调用finish(),以便在启动新Activity后关闭当前Activity(可选)
        finish();
    }

产生原因

在Android中,当你调用 startActivity(intent) 启动新的Activity时,系统会异步启动目标Activity的生命周期,并不会等待目标Activity完全初始化。因此,如果开发者在 startActivity 之后立即调用 finish() 关闭当前Activity,可能会导致当前Activity被销毁,而新的Activity尚未完全初始化。

以笔者的情况为例,由于 finish() 方法的调用,当前Activity被销毁,而 intent.putExtra(“category”, category) 的代码尚未执行。因此,传递的数据没有被正确设置,导致目标Activity在获取 category 数据时出现 NullPointerException。

解决原因

通过将 intent.putExtra 方法提前到 startActivity 之前,确保在启动新的Activity之前已经设置好传递的数据,就能够避免这个问题。这样确保了在当前Activity被销毁之前,数据已经正确传递到目标Activity,避免了 NullPointerException 异常的发生。

参考文献

Android实现从一个界面向另一个界面传递数据
产生原因以及解决原因部分 部分内容参考chatgpt

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
请添加图片描述