Используйте методы получения из вспомогательного класса SharedPreference в классе неактивности

Я новичок в Android и пробовал почти все методы использования общих настроек, но когда я пытаюсь получить значение в режиме бездействия, метод класса не работает, ТОЛЬКО ЕСЛИ ПРИЛОЖЕНИЕ УДАЛЕНО ИЗ ПОСЛЕДНИХ ПРИЛОЖЕНИЙ.

Мой сценарий похож:

Класс LocationRequestHelper.java

import android.content.Context;
import android.preference.PreferenceManager;


public class LocationRequestHelper {
    ...
    ...

    public static String getUserId() {
        return MainActivity.preferences.getString("userId","");
    }

    public static void setUserId(String userId) {
        MainActivity.preferences.edit().putString("userId", userId ).commit();
    }

}

Основная деятельность

public class MainActivity extends FragmentActivity implements
            SharedPreferences.OnSharedPreferenceChangeListener {

        public static SharedPreferences preferences;


            @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        preferences = PreferenceManager.getDefaultSharedPreferences(this);

        LocationRequestHelper.setUserId("1");

        ....
        ....

Утилиты

public class Utils {


    public static void getLocationUpdates(final Context context, final Intent intent, String broadcastevent){
        LocationResult result = LocationResult.extractResult(intent);
        if (result != null) {
            List<Location> locations = result.getLocations();
            Location firstLocation = locations.get(0);

            accuracy = firstLocation.getAccuracy();
            LocationData data = new LocationData();

            // MY FUNCTION DOESN'T WORK HERE    
            data.setUsrid(LocationRequestHelper.getUserId());
            updateServer(data);
        }
    }

getLocationUpdates вызывается из BroadcastReceiver

Теперь проблемы возникают после того, как я пытаюсь получить идентификатор пользователя с помощью

   LocationRequestHelper.getUserId();

EDITED: добавлен код трансляции

МестоположениеОбновленияШироковещательная передачаПриемник

public class LocationUpdatesBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "LUBroadcastReceiver";
    public static final String ACTION_PROCESS_UPDATES  = "PROCESS_UPDATES";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_PROCESS_UPDATES.equals(action)) {
                Utils.getLocationUpdates(context,intent,"PROCESS_UPDATES");
            }
        }
    }
}

ПРИМЕЧАНИЕ: ЭТО РАБОТАЕТ ОТЛИЧНО, ЕСЛИ ПРИЛОЖЕНИЕ НА ФОНЕ. НО АВАРИИ ПОСЛЕ УБИЙСТВА ИЗ ПОСЛЕДНИХ ПРИЛОЖЕНИЙ.

Скажите, пожалуйста, как я могу отправить сохраненный идентификатор пользователя в моем вызове API?

извините за шапки, но это основная проблема: P

Вы отменили регистрацию широковещательного приемника в уничтожении вашего класса

santoXme 11.05.2018 11:37

@santoXme Я хочу, чтобы трансляция вызывала метод, использующий значение идентификатора пользователя. Так зачем отменять регистрацию?

Code Spy 11.05.2018 11:41

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

santoXme 11.05.2018 11:49

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

Jahnold 11.05.2018 11:52

Могу я спросить, какое исключение выдает приложение при сбое? Я думаю, вы получаете NullPointerException, потому что MainActivity имеет значение null, когда приложение убито

AloDev 11.05.2018 11:53

@ jolly.exe вы получаете просочившееся исключение IntentReceiver

santoXme 11.05.2018 11:55

Добавлен код трансляции @Jahnold, это может быть проблемой. Может ли кто-нибудь научить меня, как хранить сохраненные значения и какой контекст использовать при использовании SharedPreference?

Code Spy 11.05.2018 12:02

@AloDev Я не могу отследить остановку отладчика рекламы, когда приложение было убито из недавнего

Code Spy 11.05.2018 12:03
0
8
303
1

Ответы 1

Причина сбоя приложения в том, что при его отключении любые статические переменные становятся null. Однако вы все еще пытаетесь получить доступ к SharedPreferences из широковещательного приемника и, таким образом, получаете NPE.

Первое, что вы можете сделать, это обновить свой класс LocationRequestHelper, чтобы он принял контекст в методе, а не использовал статические SharedPreferences:

public class LocationRequestHelper {
    //...

    public static String getUserId(Context context) {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        return prefs.getString("userId","");
    }

    public static void setUserId(Context context, String userId) {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        prefs.edit().putString("userId", userId ).commit();
    }
}

Затем обновите свой MainActivity, чтобы избавиться от бизнеса SharedPrefs, и измените вызов на:

LocationRequestHelper.setUserId(this, "1");

И класс Utils для:

data.setUsrid(context, LocationRequestHelper.getUserId());

Другие вопросы по теме