Search code examples
androidfirebaseandroid-sharedpreferencesandroid-jobschedulerfirebase-job-dispatcher

onSharedPreferenceChanged not working with Firebase job


I have a background service which request new data from the server if new data exists it updates the sharedpreferences in my firebase job there is notification show command that shows notification between 0, 20 sec.

Notiifcation is showing up in every 20 sec that means my job is working fine but my onSharedPreferenceChanged is not listening for the changes made for job service.

Is there anything any way to listen for the sharedPreferences changes from Job.

Home activity

public class HomeActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener
        ,SharedPreferences , SharedPreferences.OnSharedPreferenceChangeListener
{


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        testUtils.myjob(this);
        setContentView(R.layout.activity_home);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        ......

        defaultSetup();
    }


    private void defaultSetup() {

        SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(this);

        shared.registerOnSharedPreferenceChangeListener(this);
    }
    @Override
    protected void onResume() {
        super.onResume();
        SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(this);

        shared  .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(this);

        shared.unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {


//        if (key.equals(Preferences.LIST)) {
//            Toast.makeText(this, "cool", Toast.LENGTH_LONG).show();
//        }
//        if (key.equals(Preferences.CHAT_LIST)) {

        Log.e("Cool","cooooooooooooool");
            Toast.makeText(this, "cool", Toast.LENGTH_LONG).show();
//        }
    }

    @Override
    public Map<String, ?> getAll() {
        return null;
    }

    @Nullable
    @Override
    public String getString(String key, @Nullable String defValue) {
        return null;
    }

    @Nullable
    @Override
    public Set<String> getStringSet(String key, @Nullable Set<String> defValues) {
        return null;
    }

    @Override
    public int getInt(String key, int defValue) {
        return 0;
    }

    @Override
    public long getLong(String key, long defValue) {
        return 0;
    }

    @Override
    public float getFloat(String key, float defValue) {
        return 0;
    }

    @Override
    public boolean getBoolean(String key, boolean defValue) {
        return false;
    }

    @Override
    public boolean contains(String key) {
        return false;
    }

    @Override
    public Editor edit() {
        return null;
    }

    @Override
    public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {

    }

    @Override
    public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        PreferenceManager.getDefaultSharedPreferences(this)
                .unregisterOnSharedPreferenceChangeListener(this);

    }
}

Firebase Job Service

public class FirebaseJobService extends com.firebase.jobdispatcher.JobService{


    @Override
    public boolean onStartJob(com.firebase.jobdispatcher.JobParameters job) {
        String url = ApiUtil.getNewMessage();
        final Context context = this;
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        JSONArray arr;
                        try {
                            arr = new JSONArray(response);
                            SharedPreferences pref1 = getSharedPreferences(Preferences.LIST, 0);
                            String chatList = pref1.getString(Preferences.CHAT_LIST, "[]");
                            arr = Utils.concatArray(arr, new JSONArray(chatList));
                            SharedPreferences.Editor editor = pref1.edit();
                            editor.putString(Preferences.CHAT_LIST, arr.toString());
                            editor.apply();
                            NotificationUtils.show(context);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        });
        RequestManager.getInstance(this).addToRequestQueue(stringRequest);
        return false;
    }

    @Override
    public boolean onStopJob(com.firebase.jobdispatcher.JobParameters job) {
        return false;
    }
}

Solution

  • Probably :

    SharedPreferences pref1 = getSharedPreferences(Preferences.LIST, 0);
    

    causing issue, because setting registerOnSharedPreferenceChangeListener for SharedPreferences which is returned by getDefaultSharedPreferences instead of by getSharedPreferences.

    Note :

    getDefaultSharedPreferences()- uses a default preference-file name

    And

    getSharedPreferences- retrieve and hold the contents of the preferences file 'name

    So to get it work save Preferences.CHAT_LIST using getDefaultSharedPreferences or set registerOnSharedPreferenceChangeListener in Activity on instance which is returned by getSharedPreferences.