stopSerivce给出null对象引用

时间:2016-06-03 07:00:44

标签: android service

我正在尝试停止我的服务,但它提供了空对象引用。这是我的代码......

PendingUpdatesService.java

NetworkStateReceiver networkStateReceiver;
MarkAttendance attendance ;
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
    networkStateReceiver = new NetworkStateReceiver(this);
    networkStateReceiver.addListener(this);
    this.registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
   }

@Override
public void onNetworkAvailable() {
    Toast.makeText(this, "NW available", Toast.LENGTH_LONG).show();
    SharedPreferenceSingleton.getInstance().init(getApplication());
    if (SharedPreferenceSingleton.getInstance().getIntPreference(StudentsAttendanceContracts.IF_ATTENDANCE_FAILED) == 1) {
        attendance = new MarkAttendance();
        attendance.updateAttendance(getApplicationContext());
    }
}

@Override
public void onNetworkUnavailable() {
    Toast.makeText(this, "NW not available", Toast.LENGTH_LONG).show();
}

这是我试图停止服务的课程......

MarkAttendance.java

String mClassId, mStaffId ;

String date, classAttendanceDate;
Context mContext;
SQLiteDatabase mDB;

public void updateAttendance(Context context) {
    this.mContext = context;
    mDB = context.openOrCreateDatabase(DatabaseContracts.BLUEWINGS_STAFF_DB_NAME, Context.MODE_PRIVATE, null);
    SharedPreferenceSingleton.getInstance().init(context);
    mStaffId = String.valueOf(SharedPreferenceSingleton.getInstance().getIntPreference(SharedContracts.TEACHER_STAFF_ID));
    String[] parameter = {"Attendance"} ;
    String query = " SELECT * FROM " + DatabaseContracts.Tables.CheckingDataOnServer.TABLE + " WHERE " + DatabaseContracts.Tables.CheckingDataOnServer.MODULE_NAME + " =? ";
    Cursor cursor = mDB.rawQuery(query, parameter);
    cursor.moveToFirst();
    while(!cursor.isAfterLast()){
        if (cursor.getString(cursor.getColumnIndex(DatabaseContracts.Tables.CheckingDataOnServer.IS_ATTENDANCE_SAVED)).equals("false")){
            mClassId = cursor.getString(cursor.getColumnIndex(DatabaseContracts.Tables.CheckingDataOnServer.CLASS_ID));
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
            classAttendanceDate = cursor.getString(cursor.getColumnIndex(DatabaseContracts.Tables.CheckingDataOnServer.DATE));
            Date attendancedate = null;
            try {
                attendancedate = dateFormat.parse(classAttendanceDate);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            date = format.format(attendancedate);

            String[] parameters = {mClassId ,date + "%"};
            Cursor studentInfo = mDB.rawQuery(" SELECT * FROM " + DatabaseContracts.Tables.AttendanceTable.TABLE +
                    " WHERE " + DatabaseContracts.Tables.AttendanceTable.CLASS_ID + " =? " +
                    " AND " + DatabaseContracts.Tables.AttendanceTable.ATTENDANCE_DATE + " LIKE ? ", parameters);
            JSONObject attObj = new JSONObject();
            try {
                attObj.put(StudentsAttendanceContracts.FK_STAFF_ID, mStaffId);
                attObj.put(StudentsAttendanceContracts.CLASS_ID, mClassId);
                attObj.put(StudentsAttendanceContracts.ATTENDANCE_DATE, classAttendanceDate);
                JSONArray studentArray = new JSONArray();
                studentInfo.moveToFirst();
                while (!studentInfo.isAfterLast())
                {
                    JSONObject stuObj = new JSONObject();
                    stuObj.put(StudentsAttendanceContracts.STUDENT_ID, studentInfo.getString(studentInfo.getColumnIndex(DatabaseContracts.Tables.AttendanceTable.STUDENT_ID)));
                    stuObj.put(StudentsAttendanceContracts.ATTENDENCE_STATUS, studentInfo.getString(studentInfo.getColumnIndex(DatabaseContracts.Tables.AttendanceTable.ATTENDANCE_STATUS)));
                    studentArray.put(stuObj);
                    studentInfo.moveToNext();
                }
                attObj.put(StudentsAttendanceContracts.ATTENDANCE_KEY, studentArray);
                AsyncWorkerEncrypted mAsyncWorker = new AsyncWorkerEncrypted(context,false);
                mAsyncWorker.delegate = this;
                mAsyncWorker.execute(ServerConnector.MARK_ATTENDANCE, attObj.toString(), RequestConstants.POST_REQUEST, RequestConstants.HEADER_YES, RequestConstants.MARK_ATTENDANCE);


            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
        cursor.moveToNext();
    }
}

@Override
public void onRefresh() {

}

@Override
public void ReceivedResponseFromServer(String output, String REQUEST_NUMBER) {
    switch (REQUEST_NUMBER) {
        case RequestConstants.MARK_ATTENDANCE :
            Boolean response = false  ;
            try {
                JSONObject obj = new JSONObject(output);
                response = obj.getBoolean(StudentsAttendanceContracts.RESPONSE_STATUS);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            if(response){
                String[] updateparameterOfCheckingPendingUpdatesTable = {"true", "Attendance", mClassId, date+"%"};
                String Updatequery = " UPDATE " + DatabaseContracts.Tables.CheckingDataOnServer.TABLE + " SET " +
                        "" + DatabaseContracts.Tables.CheckingDataOnServer.IS_ATTENDANCE_SAVED + " =? " +
                        " WHERE " + DatabaseContracts.Tables.CheckingDataOnServer.MODULE_NAME + " =? " +
                        " AND " + DatabaseContracts.Tables.CheckingDataOnServer.CLASS_ID + " =? " +
                        " AND " + DatabaseContracts.Tables.CheckingDataOnServer.DATE + " LIKE ? " ;
                mDB.execSQL(Updatequery, updateparameterOfCheckingPendingUpdatesTable);
                stopService(new Intent(mContext, PendingUpdatesService.class)) ;
                SharedPreferenceSingleton.getInstance().init(mContext);
                SharedPreferenceSingleton.getInstance().writeIntPreference(StudentsAttendanceContracts.IF_ATTENDANCE_FAILED, 0);
            }
            break;
    }
}

在这里输入代码

stopService(new Intent(mContext,PendingUpdatesService.class));

对于这一行我得到了上下文的空对象引用....

这是我的stacktrace

06-03 12:55:43.051 7714-7714/com.synclovis.bluewingsstaff E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.synclovis.bluewingsstaff, PID: 7714
                                                                        java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Context.stopService(android.content.Intent)' on a null object reference
                                                                            at android.content.ContextWrapper.stopService(ContextWrapper.java:539)
                                                                            at com.synclovis.bluewingsstaff.util.MarkAttendance.ReceivedResponseFromServer(MarkAttendance.java:119)
                                                                            at com.synclovis.bluewingsstaff.networkEngine.AsyncWorkerEncrypted.onPostExecute(AsyncWorkerEncrypted.java:178)
                                                                            at com.synclovis.bluewingsstaff.networkEngine.AsyncWorkerEncrypted.onPostExecute(AsyncWorkerEncrypted.java:26)
                                                                            at android.os.AsyncTask.finish(AsyncTask.java:636)
                                                                            at android.os.AsyncTask.access$500(AsyncTask.java:177)
                                                                            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                            at android.os.Looper.loop(Looper.java:145)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:6946)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at java.lang.reflect.Method.invoke(Method.java:372)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

2 个答案:

答案 0 :(得分:0)

尝试将getApplicationContext()替换为this

请提供异常发生时logcat中出现的堆栈跟踪。

答案 1 :(得分:0)

  1. 您正在从异步任务中调用ReceivedResponseFromServer方法。
  2. 看起来像updateAttendance()是你想要设置上下文的地方。
  3. 很难判断它是否是线程问题或其他问题,但快速修复应该只是在异步任务中传入上下文(如果您有权访问它)。这样你就不需要在updateAttendance()中设置上下文了,因为你还没有在那个方法中使用它(除非你在课堂的其他地方使用它)。