问题
笔者进行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
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈