我必须从Service android调用一个打开与内部android数据库(sqlite)连接的方法。我正在使用以下代码:
public class myService extends Service{
public void setDB(DB_DatabaseManager db){
dbManager = db;
}
public DB_DatabaseManager dbManager;
private Timer timer;
public IBinder onBind(Intent intent){
return null;
}
public void onCreate(){
super.onCreate();
Log.i("my attempt","service activated");
TimerTask task = new TimerTask(){
public void run(){
Log.i("my attempt","ANDROID SERVICE RUNNING!");
dbManager.open(); // <--this statement generates error!
// --- in this section I start the communication with database
}
};
timer = new Timer();
timer.schedule(task, 0, 20000);
}
public void onDestroy(){
super.onDestroy();
timer.cancel();
timer = null;
Log.i("my attampt", "service stopped");
}
open()定义为:
SQLiteDatabase mDb=mDbHelper.getWritableDatabase();
为了调用我使用的服务:
myService serv = new myService();
serv.setDB(dbManager);
startService(new Intent(this,myService.class));
如果删除行dbManager.open(),则一切正常; 但是我的coode的其他部分中的方法dbManager.open()运行良好。但在这种情况下,我在logcat中获得以下错误:
09-14 23:44:32.287: E/AndroidRuntime(1115): FATAL EXCEPTION: Timer-0
09-14 23:44:32.287: E/AndroidRuntime(1115): java.lang.NullPointerException
09-14 23:44:32.287: E/AndroidRuntime(1115): at host.framework.myService$1.run(myService.java:49)
09-14 23:44:32.287: E/AndroidRuntime(1115): at java.util.Timer$TimerImpl.run(Timer.java:284)
答案 0 :(得分:2)
不要试图这样做......
myService serv = new myService();
与Activity
类相似,Service
是一个“特殊情况”类,您绝不应尝试使用new
创建实例。
使用Service
或bindService(...)
创建startService(...)
,操作系统负责创建/实例化它。
在您的情况下,您似乎需要Service
能够访问数据库“帮助程序”类,并且您可以通过多种方式执行此操作。
一种方法是扩展Application
类,并让它创建db帮助程序的实例并保留static
对它的引用。这样在Service
中,你可以简单地使用......
MyApp.mDbHelper.open();
或者使用{heller]的singleton
模型,这样你就可以在Service
中执行以下操作......
DB_DatabaseManager.getInstance().open();