Мое приложение закрывается, когда оно пытается получить доступ к общим настройкам из неактивного класса - PullRequest
0 голосов
/ 08 декабря 2018

Я новичок в Android, и приложение прекращает работу при доступе к SharedPreferences из неактивного класса.Ниже приведен мой код: в режиме Debug код работает до sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); после этой строки, приложение закрывается.

package org.traccar.client;

import android.content.Context;
import android.content.SharedPreferences;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.preference.PreferenceManager;

import java.util.Date;

import static android.content.Context.MODE_PRIVATE;

public class Position {
   private static SharedPreferences sharedPreferences;


    private Context context;
    public Position() {
    }
    public Position(Context context) {
        this.context=context;
    }

    public Position(String deviceId, Location location, double battery) {
        this.deviceId = deviceId;
        time = new Date(location.getTime());
        latitude = location.getLatitude();
        longitude = location.getLongitude();
        altitude = location.getAltitude();
        speed = location.getSpeed() * 1.943844; // speed in knots
        course = location.getBearing();
        if (location.getProvider() != null && !location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
            accuracy = location.getAccuracy();
        }
        sharedPreferences  = PreferenceManager.getDefaultSharedPreferences(context);
        boolean ccflag =  sharedPreferences.getBoolean("CheckIn", false);
        sharedPreferences.edit().putBoolean("CheckIn", true).apply();


        if (ccflag == true){
            mock = ccflag;
        }
        this.battery=battery;



    }

    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    private String deviceId;

    public String getDeviceId() {
        return deviceId;
    }

    public void setDeviceId(String deviceId) {
        this.deviceId = deviceId;
    }

    private Date time;

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    private double latitude;

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    private double longitude;

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    private double altitude;

    public double getAltitude() {
        return altitude;
    }

    public void setAltitude(double altitude) {
        this.altitude = altitude;
    }

    private double speed;

    public double getSpeed() {
        return speed;
    }

    public void setSpeed(double speed) {
        this.speed = speed;
    }

    private double course;

    public double getCourse() {
        return course;
    }

    public void setCourse(double course) {
        this.course = course;
    }

    private double accuracy;

    public double getAccuracy() {
        return accuracy;
    }

    public void setAccuracy(double accuracy) {
        this.accuracy = accuracy;
    }

    private double battery;

    public double getBattery() {
        return battery;
    }

    public void setBattery(double battery) {
        this.battery = battery;
    }

    private boolean mock;

    public boolean getMock() {
        return mock;
    }

    public void setMock(boolean mock) {
        this.mock = mock;
    }

}

Ошибка в Android Studio

Добавление скриншота режима отладки здесь

Когда я попробовал в первый раз, я не смог поместить контекст туда.после поиска в Google я нашел способ добавить контекст в неактивный класс

private Context context;
public Position(Context context) {
        this.context=context;
    }

после добавления этого кода я могу удалить все ошибки.После устранения ошибки мое приложение также было прекращено.Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Когда дело доходит до использования context , многие разработчики Android все еще не могут выбрать контекст Activity или Application application.

Что ж, выбор подходящего контекста может быть не таким тривиальным, но этокак я принимаю решениеПри использовании общих предпочтений я проверяю, должна ли сохраняемая информация использоваться только для текущего жизненного цикла представлений или даже после того, как она уничтожена.

Если она необходима только для текущего прохода жизненного цикла представленияэто контекст (Activity), иначе передайте ему контекст приложения.

1.Для контекста активности передайте -> this

2.Для контекста приложения,pass -> getApplicationContext()

Я лично предпочитаю контекст приложения при использовании sharedPreference .Итак, чтобы решить вашу проблему, sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

0 голосов
/ 09 декабря 2018

Вы можете просто использовать PowerPreference, он будет использовать контекст приложения.

Нет необходимости передавать контекст каждый раз, когда вы хотите использовать SharedPreference

   PowerPreference.getDefaultFile().putBoolean("CheckIn", true);

https://github.com/AliAsadi/Android-Power-Preference

0 голосов
/ 08 декабря 2018

Попробуйте заменить контекст в

sharedPreferences  = PreferenceManager.getDefaultSharedPreferences(context);

на «Position.this», то есть

sharedPreferences  = PreferenceManager.getDefaultSharedPreferences(Position.this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...