1

我必须从 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(); 一切正常 但是,我的代码的其他部分中的方法 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)
4

1 回答 1

2

不要尝试这样做...

myService serv = new myService();

Activity类类似,Service是一个“特例”类,你永远不应该尝试使用new.

AService是使用bindService(...)or创建startService(...)的,操作系统负责创建/实例化它。

在您的情况下,您似乎需要Service能够访问数据库“助手”类,并且有多种方法可以做到这一点。

一种方法是扩展Application该类并让它创建 db 帮助器的实例并保存static对它的引用。这样在 中Service,您可以简单地使用...

MyApp.mDbHelper.open();

或者将singleton模型用于您的数据库助手,这将允许您在Service...中执行以下操作

DB_DatabaseManager.getInstance().open();
于 2012-09-15T00:24:04.127 回答