Broadcast Receiver не чете текущата стойност в Споделени предпочитания

Имам дейност с настройки с предпочитание за редактиране на текст, което записва в споделени предпочитания низ, който е IP адрес, след това имам приемник за излъчване, където AsyncTask прави повикване към услуга. Бих искал да направя персонализиран url адрес, но когато правя повикване, не се взема текущата стойност на ip адреса, но когато рестартирам приложението ми, се взема правилната стойност. Как мога да реша този проблем. Поставям само полезния код. Благодаря предварително

public class Broadcast extends BroadcastReceiver {


@Override
public void onReceive(final Context context, Intent intent) {

    preferences = PreferenceManager.getDefaultSharedPreferences(context);

        new Call().execute();

}



private class Call extends AsyncTask<String, String, String> {

    String ip;

    @Override
    protected String doInBackground(String... params) {

            ip = preferences.getString("key","");


        String result = RestFullConnection.postCall("http://" + ip + ":8080/app/api/bla/sync", params[0]);
        return result;

    }

}

+++ редактиране +++ Извиквам излъчване в MainActivity и запазвам стойността в SP с помощта на EditTextPreference:

    Intent alarmIntent = new Intent(getApplicationContext(), Broadcast.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 5000, 30 * 1000, pendingIntent);

person mike5v    schedule 07.02.2017    source източник
comment
Къде и кога се задейства излъчването? И публикувайте кода, където записвате ip.   -  person Robin Rex    schedule 07.02.2017
comment
Редактирам въпроса си.   -  person mike5v    schedule 07.02.2017


Отговори (2)


Моля, опитайте това в onReceive

preferenze = context.getSharedPreferences(PERFERENCE_NAME,
            Context.MODE_PRIVATE);

Надявам се, че ще ви помогне.

person Vishal Chhodwani    schedule 07.02.2017

Зависи как запазвате вашите SharedPreferences. Използването на метода apply() ще съхрани стойността асинхронно, така че няма да блокира текущата нишка. commit() от друга страна записва стойността незабавно. Това може да е проблем във вашия случай (моля, предоставете своя код там, където запазвате вашите SharedPreferences).

Бъдете внимателни, че SharedPreferences не работят правилно в различните процеси! Ако използвате различни процеси, препоръчвам да използвате някакъв механизъм, който работи с него (напр. IPC, бази данни, ...).

Алтернативна библиотека, която замества SharedPreferences, е Tray. Той използва доставчик на съдържание/бази данни и има подобен синтаксис. Можете дори да импортирате съществуващи данни от SharedPreferences.

person dipdipdip    schedule 07.02.2017
comment
както писах във въпроса си, не запазвам стойността програмно, а използвам компонент (edittextpreference), който го прави вместо мен - person mike5v; 07.02.2017
comment
Все още има посочените проблеми - iirc EditTextPreference използва apply(). - person dipdipdip; 07.02.2017
comment
Сега, след като разбрахме проблема, кое може да е решението? - person mike5v; 07.02.2017
comment
Не използвайте EditTextPreference. - person dipdipdip; 07.02.2017