Используйте методы получения из вспомогательного класса SharedPreference в неактивном классе - PullRequest
0 голосов
/ 11 мая 2018

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

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

Класс 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();
    }

}

MainActivity

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

        ....
        ....

Utils

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

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

   LocationRequestHelper.getUserId();

ИЗМЕНЕНО: добавлен код трансляции

LocationUpdatesBroadcastReceiver

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

1 Ответ

0 голосов
/ 11 мая 2018

Причиной сбоя приложения является то, что при его завершении любые статические переменные становятся 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...