gpt4 book ai didi

java - 无法在 Java 中初始化静态成员 - Android

转载 作者:太空宇宙 更新时间:2023-11-04 12:42:21 24 4
gpt4 key购买 nike

我有一个名为 Prefs 的帮助器 class,其中有 interface SyncFinishedListener 的静态 class 成员。它们是:

public interface SyncFinishedListener {
void onSyncFinished();
}

这是我的 Prefs 辅助类

public class Prefs {
public static final String TAG = Prefs.class.getSimpleName();
private static final String PrefsName = Prefs.class.getSimpleName();

SharedPreferences mPrefs;

public Prefs(Context context) {
super();
mPrefs = context.getSharedPreferences(PrefsName, Context.MODE_PRIVATE);
}

private static SyncFinishedListener listener;

public Prefs(Context context, SyncFinishedListener listener) {
this(context);
Prefs.listener = listener;
SyncUtils.get(context).requestSync(HrEmployee.AUTHORITY);
}

private boolean isSyncFinished() {
boolean isSyncFinished = (isHrEmployeeSyncFinished()
&& isHrAttendanceSyncFinished()
&& isAttReportSyncFinished()
&& isSchoolSchoolSyncFinished()
);
Log.e(TAG, "isSyncFinished is :" + isSyncFinished);
if (isSyncFinished) {
try {
setHrEmployeeSyncFinished(false);
setHrAttendanceSyncFinished(false);
setAttReportSyncFinished(false);
setSchoolSchoolSyncFinished(false);
// Here's NullPointerException
Prefs.listener.onSyncFinished();
} catch (Exception e) {
e.printStackTrace();
}
}
return isSyncFinished;
}

private static final String HrEmployeeSyncFinished = "hrEmployeeSyncFinished";
private static final String HrAttendanceSyncFinished = "hrAttendanceSyncFinished";
private static final String AttReportSyncFinished = "attReportSyncFinished";
private static final String SchoolSchoolSyncFinished = "schoolSchoolSyncFinished";

private boolean isHrEmployeeSyncFinished() {
return mPrefs.getBoolean(HrEmployeeSyncFinished, false);
}

public Prefs setHrEmployeeSyncFinished(boolean hrEmployeeSyncFinished) {
mPrefs.edit().putBoolean(HrEmployeeSyncFinished, hrEmployeeSyncFinished).apply();
if (hrEmployeeSyncFinished) {
isSyncFinished();
}
return this;
}

private boolean isHrAttendanceSyncFinished() {
return mPrefs.getBoolean(HrAttendanceSyncFinished, false);
}

public Prefs setHrAttendanceSyncFinished(boolean hrAttendanceSyncFinished) {
mPrefs.edit().putBoolean(HrAttendanceSyncFinished, hrAttendanceSyncFinished).apply();
if (hrAttendanceSyncFinished) {
isSyncFinished();
}
return this;
}

private boolean isAttReportSyncFinished() {
return mPrefs.getBoolean(AttReportSyncFinished, false);
}

public Prefs setAttReportSyncFinished(boolean attReportSyncFinished) {
mPrefs.edit().putBoolean(AttReportSyncFinished, attReportSyncFinished).apply();
if (attReportSyncFinished) {
isSyncFinished();
}
return this;
}

private boolean isSchoolSchoolSyncFinished() {
return mPrefs.getBoolean(SchoolSchoolSyncFinished, false);
}

public Prefs setSchoolSchoolSyncFinished(boolean schoolSchoolSyncFinished) {
mPrefs.edit().putBoolean(SchoolSchoolSyncFinished, schoolSchoolSyncFinished).apply();
if (schoolSchoolSyncFinished) {
isSyncFinished();
}
return this;
}
}

这是我如何从 Fragment 调用它

public class Employees extends BaseFragment {

private static final String TAG = Employees.class.getSimpleName();
private Prefs mPrefs;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mPrefs = new Prefs(getContext());
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_employee, menu);
super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_sync) {
return onSync();
}
return super.onOptionsItemSelected(item);
}

private boolean onSync() {
try {
final ProgressDialog dialog = new ProgressDialog(getContext(), R.style.AppDialogTheme);
dialog.setTitle("Please Wait");
dialog.setMessage("Syncing Data");
dialog.setCancelable(false);
dialog.show();

new Prefs(getContext(), new SyncFinishedListener() {
@Override
public void onSyncFinished() {
// Not getting called
dialog.dismiss();
getActivity().finish();
}
});
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}

我的代码应该运行良好。但是,我不明白为什么会出现 NullPointerException 。这是一些用于调试的日志

E/HrEmployee: onSyncStarted
E/HrAttendance: onSyncStarted
E/SchoolSchool: onSyncStarted
E/SchoolSchool: onSyncFinished
E/Prefs: isSyncFinished is :false
E/HrEmployee: onSyncFinished
E/Prefs: isSyncFinished is :false
E/AttReport: onSyncStarted
E/HrEmployee: onSyncStarted
E/HrEmployee: onSyncFinished
E/Prefs: isSyncFinished is :false
E/HrAttendance: onSyncStarted
E/HrAttendance: onSyncFinished
E/Prefs: isSyncFinished is :false
E/SchoolSchool: onSyncStarted
E/SchoolSchool: onSyncFinished
E/Prefs: isSyncFinished is :false
E/AttReport: onSyncStarted
E/HrEmployee: onSyncStarted
E/HrEmployee: onSyncStarted
E/HrEmployee: onSyncFinished
E/Prefs: isSyncFinished is :false
E/HrAttendance: onSyncStarted
E/HrEmployee: onSyncFinished
E/Prefs: isSyncFinished is :false
E/AttReport: onSyncStarted
E/AttReport: onSyncFinished
E/Prefs: isSyncFinished is :false
E/HrAttendance: onSyncFinished
E/Prefs: isSyncFinished is :false
E/HrAttendance: onSyncStarted
E/HrAttendance: onSyncFinished
E/Prefs: isSyncFinished is :false
E/SchoolSchool: onSyncStarted
E/SchoolSchool: onSyncFinished
E/Prefs: isSyncFinished is :false
E/HrAttendance: onSyncFinished
E/Prefs: isSyncFinished is :false
E/AttReport: onSyncFinished
E/Prefs: isSyncFinished is :true
W/System.err: java.lang.NullPointerException: Attempt to invoke interface method 'void com.odoo.addons.employees.utils.SyncFinishedListener.onSyncFinished()' on a null object reference
W/System.err: at com.odoo.addons.employees.utils.Prefs.isSyncFinished(Prefs.java:145)
W/System.err: at com.odoo.addons.employees.utils.Prefs.setAttReportSyncFinished(Prefs.java:115)
W/System.err: at com.odoo.addons.employees.models.AttReport.onSyncFinished(AttReport.java:58)
W/System.err: at com.odoo.core.service.OSyncAdapter.syncData(OSyncAdapter.java:291)
W/System.err: at com.odoo.core.service.OSyncAdapter.onPerformSync(OSyncAdapter.java:204)
W/System.err: at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:272)

最佳答案

首先,您没有理由在第一个构造函数中调用 super(),因为您没有扩展任何类。

其次,至少在这段代码中,listener 没有理由应该是静态的。如果您从该代码外部调用 Prefs.listener,则应通过删除静态调用来重新考虑整个架构。这是一个几乎总是可以避免的坏习惯。如果该类只有在您的应用程序中使用的静态变量,您应该考虑使用单例设计模式。一旦您习惯了它,它就会变得简单且安全。

关于java - 无法在 Java 中初始化静态成员 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36710739/

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