Cześć. W swojej aplikacji wysyłam requesta GET przy użyciu biblioteki Volley, a wynik requesta zapisuję w SharedPreferences w postaci listy. Dzieje się jednak coś dziwnego, podczas pierwszego naciśnięcia przycisku inicjalizującego wysłanie requesta, zapisanie listy w sharedpreferences, odczytanie listy i ustawienie napisu - wczytywana z SharedPreferences lista jest pusta. Natomiast po ponownym naciśnięciu tego samego przycisku i odpaleniu tej procedury poraz drugi lista jest już poprawnie wczytana z SharedPreferences.
Czy ktoś wie, o co tu może chodzić ? Gdzie jest błąd ?
MainActivity.class
package breakthecode.com.resttraining;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class SecondActivity extends AppCompatActivity {
private static String JSON_URL = "***";
static List<City> listOfCities;
TextView textView;
Button btn;
private AppPreferencesHelper sharedPrefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
textView = findViewById(R.id.textView);
btn = findViewById(R.id.btn);
sharedPrefs = new AppPreferencesHelper(this, "Shared_Preferences");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendRequest();
}
});
}
private void sendRequest(){
extractCities();
List<City> newListOfCities = sharedPrefs.getListOfCities();
textView.setText("Lista ma dlugosc " + newListOfCities.size());
}
private void extractCities(){
listOfCities = new ArrayList<>();
RequestQueue queue = Volley.newRequestQueue(this);
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, JSON_URL, null, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i = 0; i < response.length(); i++) {
try {
JSONObject songObject = response.getJSONObject(i);
City city = new City();
city.setId(songObject.getInt("id"));
city.setCityName(songObject.getString("cityName"));
city.setBusStopName(songObject.getString("busStopName"));
listOfCities.add(city);
} catch (JSONException e) {
e.printStackTrace();
}
}
sharedPrefs.setListOfCities(listOfCities);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(jsonArrayRequest);
}
}
AppPreferencesHelper.class
package breakthecode.com.resttraining;
import android.content.Context;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class AppPreferencesHelper {
private static final String LIST_OF_CITIES = "LIST_OF_CITIES";
private final SharedPreferences mPrefs;
private SharedPreferences.Editor editor;
public AppPreferencesHelper(Context context, String prefFileName){
mPrefs = context.getSharedPreferences(prefFileName, Context.MODE_PRIVATE);
}
public List<City> getListOfCities() {
Gson gson = new Gson();
String json = mPrefs.getString(LIST_OF_CITIES, null);
Type type = new TypeToken<List<City>>() {}.getType();
List<City> listOfCities = gson.fromJson(json, type);
if(listOfCities == null){
listOfCities = new ArrayList<City>();
}
return listOfCities;
}
public void setListOfCities(List<City> listOfCities) {
editor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(listOfCities);
editor.putString(LIST_OF_CITIES, json);
editor.apply();
}
}