gpt4 book ai didi

java - 在 fragment 的 onCreateOptionsMenu() 中使用 getActivity() 偶尔会抛出 NPE

转载 作者:太空狗 更新时间:2023-10-29 15:25:53 26 4
gpt4 key购买 nike

我在 fragment 中使用 SearchManager。不幸的是,使用方法调用 getActivity().getSystemService(Context.SEARCH_SERVICE)偶尔会抛出 NullPointerException。这发生在仪器化的 Espresso 单元测试和正常使用期间。当我再次运行测试时,一切都很好。你能告诉我如何解决这个问题吗?谢谢。

堆栈跟踪:

06-05 16:10:59.162 19183 19183 D AndroidRuntime: Shutting down VM
06-05 16:10:59.188 19183 19183 E AndroidRuntime: FATAL EXCEPTION: main
06-05 16:10:59.188 19183 19183 E AndroidRuntime: Process: foo.bar.baz, PID: 19183
06-05 16:10:59.188 19183 19183 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.app.Activity.getSystemService(java.lang.String)' on a null object reference
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at foo.bar.baz.sign_browser.SignBrowserFragment.onCreateOptionsMenu(SignBrowserFragment.java:139)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.app.Fragment.performCreateOptionsMenu(Fragment.java:2133)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1945)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.app.Activity.onCreatePanelMenu(Activity.java:2834)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:298)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:241)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:443)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:60)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5343)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
06-05 16:10:59.188 19183 19183 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
06-05 16:10:59.227 835 1557 I WindowManager: Screen frozen for +393ms due to AppWindowToken{19c5842b token=Token{34cb447a ActivityRecord{10afa8a5 u0 foo.bar.baz/.activities.MainActivity t4133}}}
06-05 16:10:59.233 835 1557 W ActivityManager: Force finishing activity 1 foo.bar.baz/.activities.MainActivity

SignBrowserFragment.onCreateOptionsMenu()

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.d(TAG, "onCreateOptionsMenu " + hashCode());
inflater.inflate(R.menu.options_sign_browser, menu);
final MenuItem item = menu.findItem(R.id.action_toggle_starred);
if (this.showStarredOnly) {
item.setIcon(R.drawable.ic_sign_browser_grade_checked);
} else {
item.setIcon(R.drawable.ic_sign_browser_grade);
}
final SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
}

我正在使用 MainActivity 中包含的 SignBrowserFragment 来添加用于搜索的选项菜单条目。实际搜索是在单独的 SignSearch Activity 中执行的。

list 文件:

    <activity
android:name=".activities.MainActivity"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<meta-data
android:name="android.app.default_searchable"
android:value=".sign_browser.search.SignSearchActivity" />
</activity>
<activity
android:name=".sign_browser.search.SignSearchActivity"
android:parentActivityName=".activities.MainActivity"
tools:ignore="UnusedAttribute">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>

<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity" />
</activity>

如果您需要更多信息,请告诉我。

编辑:为什么这被标记为“如何修复 NullPointerException”的副本?这与将其标记为“如何修复错误”的副本一样明智。 :(

编辑 2:对不起,伙计们。正如我刚刚意识到的那样,我为方法 onCreateOptionsMenu 发布了错误的代码。我的代码 fragment 来自 SignSearchActitivity。唯一真正的区别是在 fragment 中 getActivity() 在调用 getSystemService 之前被调用。所以 getActivty() 返回 null。为什么这种情况偶尔发生在 fragment 的 onCreateOptionsMenu() 方法中?

最佳答案

问题出在

searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

如果对象为 null(意味着 getSystemService(Context.SEARCH_SERVICE); 返回了一个 null 对象)怎么办?它会抛出 NPE,对吧。

将您的代码更改为:

 if(searchManager != null){
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
}
else{
// Can't perform the search because of null object message to the user (or) log (or) console.
}

关于java - 在 fragment 的 onCreateOptionsMenu() 中使用 getActivity() 偶尔会抛出 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37712727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com