2012-09-14 63 views
1

我必須從服務android調用一個打開內部android數據庫連接的方法(sqlite)。我使用下面的代碼:從Android服務內部打開數據庫連接時出錯

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)); 

都正常工作,如果我刪除row 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) 

回答

2

不要試圖做到這一點...

myService serv = new myService(); 

Activity類相似,Service是一個「特例」級和你不應該嘗試使用new來創建一個實例。

A Service使用bindService(...)startService(...)創建,操作系統負責創建/實例化它。

在你的情況下,你似乎需要你的Service能夠訪問數據庫「幫手」類,有很多方法可以做到這一點。

一種方法是擴展Application類,並讓它創建db幫助程序的實例並保存對其的引用static。這樣在Service,你可以簡單地使用...

MyApp.mDbHelper.open(); 

或者使用singleton型號爲你的數據庫幫手,這將允許你做這樣的事情在Service以下...

DB_DatabaseManager.getInstance().open();