0
public class ValuatorService extends Service {
    SQLLiteAdapter db;
    Context context;
    String strLat, strLong, strTempLat, strTempLong;
    static String prospect_no;
    public Database database;
    long boolDistanceDetail;
    static double dist, roundOff;
    SQLLiteAdapter adapter;
    public ArrayList<String> latDetails;
    private ArrayList<Double> distanceList;
    static int loop = 0;

    public ValuatorService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        db = new SQLLiteAdapter(this);
        db.open();
        context = getApplicationContext();
        database = Database.getDBAdapterInstance(context);
        distanceList = new ArrayList<>();
    }

    @SuppressLint("NewApi")
    @Override
    public void onStart(Intent intent, int startId) {
        // Perform your long running operations here.

        long boolDistanceDetail = db.insertDistanceDetail(Util
                .getstringvaluefromkey(MenuScreen.activity, "LoginName"), Util
                .getstringvaluefromkey(MenuScreen.activity, "trackid"), Util
                .getstringvaluefromkey(MenuScreen.activity, "SimNo"), Util
                .getstringvaluefromkey(MenuScreen.activity, "req_no"), Util
                .getstringvaluefromkey(MenuScreen.activity, "customer_name"),
                Util.getstringvaluefromkey(MenuScreen.activity, "cus_mobile"),
                Util.getstringvaluefromkey(MenuScreen.activity, "city"), Util
                        .getstringvaluefromkey(MenuScreen.activity,
                                "prospect_no"));
        Log.e("Tab1 Insert", String.valueOf(boolDistanceDetail));
        prospect_no = Util.getstringvaluefromkey(MenuScreen.activity,
                "prospect_no");

        loop = 0;
        getLatLong();

    }

    @Override
    public void onDestroy() {

        db.sumDistance();
        db.close();
    }

    public void getLatLong() {
        loop++;
        LocationResult locationResult = new MyLocation.LocationResult() {
            @Override
            public void gotLocation(Location location) {
                try {
                    strLat = String.valueOf(location.getLatitude());
                    strLong = String.valueOf(location.getLongitude());
                    if (loop == 1) {
                        boolDistanceDetail = db.insertLatLong(prospect_no,
                                strLat, strLong, "0");
                        strTempLat = strLat;
                        strTempLong = strLong;
                    } else if (loop > 1) {
                        boolDistanceDetail = db.insertLatLong(
                                prospect_no,
                                strLat,
                                strLong,
                                String.valueOf(distFrom(
                                        Float.parseFloat(strTempLat),
                                        Float.parseFloat(strTempLong),
                                        Float.parseFloat(strLat),
                                        Float.parseFloat(strLong))));
                        strTempLat = strLat;
                        strTempLong = strLong;
                        Log.e("distFrom",
                                String.valueOf(distFrom(
                                        Float.parseFloat(strTempLat),
                                        Float.parseFloat(strTempLong),
                                        Float.parseFloat(strLat),
                                        Float.parseFloat(strLong))));

                    }

                    Log.e("Tab1 Insert", String.valueOf(boolDistanceDetail));
                    Log.e("OldLat - OldLong", strTempLat + " - " + strTempLong);
                    Log.e("Lat - Long", strLat + " - " + strLong);

                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            getLatLong();
                            distanceList.add(roundOff);
                            Log.d("ValuatorService", "" + distanceList);
                        }
                    }, 10000);
                } catch (Exception ex) {
                    Log.e("Error", ex.toString());
                }
            }
        };

        MyLocation myLocation = new MyLocation();
        myLocation.getLocation(context, locationResult);
    }

    private static float distFrom(float fltFromLat, float fltFromLong,
            float fltToLat, float fltToLong) {
        double earthRadius = 6371000; // meters
        double dLat = Math.toRadians(fltToLat - fltFromLat);
        double dLng = Math.toRadians(fltToLong - fltFromLong);
        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
                + Math.cos(Math.toRadians(fltFromLat))
                * Math.cos(Math.toRadians(fltToLat)) * Math.sin(dLng / 2)
                * Math.sin(dLng / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        dist = (float) ((earthRadius * c) / 1000);
        roundOff = Math.round(dist * 100.0) / 100.0;

        return (float) roundOff;
    }
}

サービスを停止した後、ログ cat にエラーが表示されます:

java.lang.IllegalStateException: すでに閉じられているオブジェクトを再度開こうとしています: SQLiteDatabase: /data/data/com.mahindra.tev/databases/TravelDistance.db

4

1 に答える 1

1

これは、データベースから非同期的に読み取り/書き込みを行っていることを意味し、 onDestroy() が呼び出されると、データベースを閉じたためアクセスできなくなります。

簡単な解決策は、メソッドdb.close()内で呼び出すのでonDestroy()はなく、実際に使い終わったときにのみ呼び出すことです。

db.isOpen()別の解決策は、実際に行を挿入/更新する前にチェックすることです。

于 2015-09-23T07:40:39.320 に答える