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();を削除すると、すべて正常に機能します。ただし、私の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)
4

1 に答える 1

2

これをしようとしないでください...

myService serv = new myService();

Activityクラスと同様に、これServiceは「特殊なケース」のクラスであり、を使用してインスタンスを作成しようとしないでくださいnew

AServiceは、またはのいずれbindService(...)かを使用して作成されstartService(...)、作成/インスタンス化するのはOSの責任です。

あなたの場合Service、データベースの「ヘルパー」クラスにアクセスできるようにする必要があるようです。これを行うには、いくつかの方法があります。

1つの方法は、クラスを拡張してApplication、dbヘルパーのインスタンスを作成し、そのインスタンスへのstatic参照を保持することです。このように、Serviceで、あなたは単に使用することができます...

MyApp.mDbHelper.open();

または、dbヘルパーのモデルを使用してsingleton、次のようなことを実行できるようにしますService...

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