4

locationlistener を実装するサービス クラスを持つアプリケーションがあります。onLocationChanged() で受信した場所をメイン アクティビティに戻せるようにしたいと考えています。私はこれまでSQLiteデータベースに書き込むことでこれを実装しようとしていましたが、データベースを開いて書き込み可能にしようとするとエラーが発生しました。書き込みコンテキストがないことと関係があると思いますが、それを理解できませんでした。ただし、データベースへの書き込みは、onCreate() で行うと完全に正常に機能します。最初は次のようにしてみました:

@Override
    public void onLocationChanged(Location loc) {//Spits out single location for current disconnect
        System.out.println("location equals "+loc);
        latitude=Double.toString(loc.getLatitude());
        longitude=Double.toString(loc.getLongitude());
        writeToDb(MyLocListener.this,latitude,longitude);       
        man.removeUpdates(listener);//Stops location manager from listening for updates
        listener=null;
        man=null;
    }

public void writeToDb(Context context,String latitude,String longitude){
    db=new DbAdapter(context);
    db.openToWrite();
    db.deleteAll();
    db.insert(latitude);
    db.insert(longitude);
    db.close();
}

しかし、それは役に立たず、毎回 db.openToWrite() 行で nullPointerException が発生しました。ここでも getApplicationContext() は機能しません。

次のようにスレッドで DB に書き込むように変更しました。

@Override
public void onLocationChanged(Location loc) {//Spits out single location for current disconnect
    System.out.println("location equals "+loc);
    latitude=Double.toString(loc.getLatitude());
    longitude=Double.toString(loc.getLongitude());
    Runnable runner=new SaveLocation(latitude,longitude);
    new Thread(runner).start();
    man.removeUpdates(listener);//Stops location manager from listening for updates
    listener=null;
    man=null;
}

public class SaveLocation implements Runnable{
        String latitude;
        String longitude;
    //  DbAdapter db;
        public SaveLocation(String latitude,String longitude){
            this.latitude=latitude;
            this.longitude=longitude;

        }
        @Override
        public void run() {
            db.openToWrite();
            db.deleteAll();
            db.insert(latitude);
            db.insert(longitude);
            db.close();     
        }
    }

そして、 onCreate() メソッドでデータベースを次のように初期化しました。

public class MyLocListener extends Service implements LocationListener{ 
    static LocationManager man;
    static LocationListener listener;
    static Location location;
    public DbAdapter db;

    @Override
    public void onCreate() {
        super.onCreate();   
        this.db=new DbAdapter(MyLocListener.this);
    }

しかし今、この 2 回目の試行では、より凝縮されたエラーが表示され続けていますが、データベースを開いて書き込み可能にしようとした行でまだエラーが発生しています。行 MyLocListener.java:92 は、行 db.openToWrite(); を参照しています。

エラーは次のとおりです。

05-30 15:35:19.698: W/dalvikvm(4557): threadid=9: thread exiting with uncaught exception (group=0x4001d7e0)
05-30 15:35:19.706: E/AndroidRuntime(4557): FATAL EXCEPTION: Thread-10
05-30 15:35:19.706: E/AndroidRuntime(4557): java.lang.NullPointerException
05-30 15:35:19.706: E/AndroidRuntime(4557):     at com.phonehalo.proto.MyLocListener$SaveLocation.run(MyLocListener.java:92)
05-30 15:35:19.706: E/AndroidRuntime(4557):     at java.lang.Thread.run(Thread.java:1096)
4

1 に答える 1

3

解決済み--- 他の誰かがこの同じ問題を抱えている場合に備えて、私は解決策を見つけましたが、それがどれほど簡単だったか信じられません. Java のガベージ コレクションが原因で、SqlDatabase へのリンクが失われていました。解決策は、単に静的として宣言することでした。次に、onLocationChanged() メソッド内で Sql の挿入/書き込みメソッドを使用できます。それが役に立てば幸い!

于 2012-09-26T17:30:35.017 に答える