AsycTask抛出IllegalStateException – 片段未附加到活动

我的Android应用程序中有以下AsyncTask。 此AsyncTask包含在扩展PreferenceFragment的类的OnCreate()方法中。

public class NotificationsPreferenceFragment extends PreferenceFragment { private static Context context; public NotificationsPreferenceFragment() { } public NotificationsPreferenceFragment(Context context) { this.context = context; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_notifications); getPreferenceManager().findPreference(getString(R.string.send_all_notifications)) .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { class NotificationSendTask extends DialogAsyncTask { public static final String TAG = "NotificationFragment"; public NotificationSendTask(Activity activity, String dialogMsg) { super(activity, dialogMsg); } @Override protected String doInBackground(String... params) { String url = PreferenceManager.getDefaultSharedPreferences(getActivity()).getString(getString(R.string.notification_web_service_url), getString(R.string.default_notification_web_service_url)); if (NetworkingHelper.isNetworkAvailable(getActivity())) { NotificationDao notificationDao = new NotificationDaoImpl(DatabaseManager.getInstance(getActivity().getApplicationContext()), getActivity().getApplicationContext()); List unsentNotificationList = notificationDao.findAllNotSent(); if (unsentNotificationList.size() != 0) { NotificationSenderTask ns = new NotificationSenderTask(url, context); try { if (ns.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (unsentNotificationList)).get()) { return getString(R.string.success); } } catch (InterruptedException e) { Log.e(TAG, e.getMessage()); } catch (ExecutionException e) { Log.e(TAG, e.getMessage()); } return getString(R.string.failed_to_send_notifications); } else { return getString(R.string.no_notifications_to_send); } } else { return getString(R.string.no_connection_notifications); } } public void onPostExecute(String result) { super.onPostExecute(result); if (dialog != null && dialog.isShowing()) { dialog.hide(); } Toast.makeText(activity, result, Toast.LENGTH_SHORT).show(); } } NotificationSendTask notificationSendTask = new NotificationSendTask(getActivity(), "Sending unsent notifications..."); notificationSendTask.execute(); return true; } }); getPreferenceManager().findPreference(getString(R.string.export_notifications)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { NotificationExportTask notificationExportTask = new NotificationExportTask(NotificationsPreferenceFragment.this.getActivity(), 1); notificationExportTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); return true; } }); } } 

我收到以下exception:

 java.lang.IllegalStateException: Fragment NotificationsPreferenceFragment{416092f8} not attached to Activity at android.app.Fragment.getResources(Fragment.java:741) at android.app.Fragment.getString(Fragment.java:763) 

有人可以向我解释为什么会发生这种情况并建议解决此问题的方法吗?

更新:

以下是活动的代码:

 public class SettingsActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onDestroy() { super.onDestroy(); } @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) public void onBuildHeaders(List
target) { loadHeadersFromResource(R.xml.pref_headers, target); } }

由于您在应用中执行后台任务。 在任务完成之前,无法保证用户将保持在同一屏幕上,因此如果用户在任务完成之前导航到其他屏幕或按下主页按钮; 你的片段与活动分离。 因此,请始终确保您在活动中附加了片段。 试试看

if (isAdded) { //Do your UI stuff here }

在上面的任何地方添加以上检查回调

将代码从onCreate移动到onActivityCreated而不是尝试getActivity @ onCreate

那是因为片段可以在活动尚未准备就绪时创建,就在您尝试使用它时。

当然, 如果您要将片段添加到以下活动:

 FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(android.R.id.content, new PreferenceFragment()).commit();