2017-03-22 46 views
2

我的目標是建立一個後臺服務,每天更新兩次相當大量的數據(可能更多~5分鐘更新)。服務構造函數中的上下文爲空?

所以我有一個推出這項服務GcmTaskService:

public class SyncOfflineCoursesService extends Service { 

    private final IBinder mBinder = new MonBinder(); 
    private final SharedPreferenceManagerToReplace sharedPreferenceManager; 

    public SyncOfflineCoursesService() { 

     sharedPreferenceManager = new SharedPreferenceManagerToReplace(this); //crash on this line 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    ... 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    public class MonBinder extends Binder { 
     SyncOfflineCoursesService getService() { 
      return SyncOfflineCoursesService.this; 
     } 
    } 

} 

SharedPreferenceManagerToReplace

public class SharedPreferenceManagerToReplace { 
    private final SharedPreferences prefs; 

    public SharedPreferenceManagerToReplace(Context context) { 
     this.prefs = PreferenceManager.getDefaultSharedPreferences(context);//crash here 
    } 
} 

,但似乎這是空當我實例化SharedPreferenceManager

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 

那怎麼我在清單中聲明瞭我的兩項服務:

<service 
    android:name=".service.offline.SyncOfflineCoursesService" 
    android:exported="false" /> 

<service 
    android:name=".service.offline.SyncOfflineContentService" 
    android:exported="true" 
    android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> 

    <intent-filter> 
     <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" /> 
    </intent-filter> 
</service> 

你有什麼想法嗎?

謝謝!

+0

使用應用程序上下文爲此 –

+1

您的'服務'應該不是真的有一個構造函數。將該初始化移至其生命週期方法之一,如'onCreate()'或'onStartCommand()'。 –

回答

5

拋出NullPointerException。

你應該onStartCommand()區間調用此。

Context context; //Public 

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
    context= getApplicationContext(); 
    sharedPreferenceManager = new SharedPreferenceManagerToReplace(context); 
    return super.onStartCommand(intent, flags, startId); 
    } 
+1

我不知道這一點,非常感謝。順便問一下,您是否確認從GcmTaskService啓動服務是每10小時下載大量數據的最佳方式? –

+0

有什麼樣的要求?有什麼選擇? –

+1

重要的數據之間的平均數(它同步課程可用於離線和可能包含各種媒體(所以視頻也) –

0

你應該有一個活動的上下文。服務的上下文無效。 在構造函數中傳遞上下文並使用該上下文傳遞下一個構造函數。當應用程序試圖使用具有空值的 對象引用

public SyncOfflineCoursesService(Context mContext) { 

    sharedPreferenceManager = new SharedPreferenceManagerToReplace(mContext); 

} 
+0

你好,謝謝!服務創建時(從GCMTaskService創建) –

+0

#Payel時沒有任何活動。需要調用'onStartCommand()'部分 –