我的目标是拥有一个后台服务,每天更新两次相当大量的数据(更新约5分钟,可能更多)。
所以我有一个启动此服务的GcmTaskService:
$query = $this->db->query("YOUR QUERY");
foreach ($query->result_array() as $row)
{
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
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
你有想法吗?
谢谢!
答案 0 :(得分:7)
当应用程序尝试使用时抛出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 :(得分:0)
您应该拥有活动的背景信息。服务的背景不起作用。 在构造函数中传递上下文并使用该上下文传递下一个构造函数。
public SyncOfflineCoursesService(Context mContext) {
sharedPreferenceManager = new SharedPreferenceManagerToReplace(mContext);
}