J'ai été bloqué sur celui-ci pendant un moment, alors je cherche enfin quelques indices. L'activité principale de mon application effectue une requête Volley GET sur Create et mes éléments ListView s'affichent correctement. En cliquant sur un élément de la liste, je passe des données à une autre activité où j'effectue ensuite une requête POST Volley qui met à jour ma base de données. Je suis alors ramené à mon activité principale où l'élément ListView précédemment sélectionné devrait immédiatement se mettre à jour (disparaître de la liste ou changer TextViews, etc.), mais il semble être un cycle en arrière si je sélectionne un autre élément et répète le processus.Volley Demande non mise à jour de données revenant d'une autre activité
J'ai testé plusieurs choses avec onResume mais je n'arrive pas à le faire fonctionner. J'ai même mis toute la requête de volée dans une méthode et j'ai essayé de l'appeler onResume mais cela a fait que ma boîte de dialogue de progression s'est bloquée et a dupliqué tout dans la liste. Toutefois, une actualisation manuelle de la liste appelée par une méthode à partir d'une barre d'outils fonctionne correctement, ainsi qu'une requête à partir d'une exécution exécutable temporisée.
UserListActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_list);
//Setting adapter to the listView
listView =(ListView) findViewById(R.id.list);
adapter =new CustomListAdapter(this,userList);
listView.setAdapter(adapter);
// Showing progress dialog before making http request
pDialog =new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
if(userList!=null) {
userList.clear();
}
// Creating volley request obj
JsonArrayRequest userReq = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, response.toString());
hidePDialog();
// Parsing json
for (int i = 0; i < response.length(); i++) {
try {
JSONObject obj = response.getJSONObject(i);
User user = new User();
user.setUserId(obj.getString("user_id"));
user.setFirstName(obj.getString("firstname"));
user.setLastName(obj.getString("lastname"));
// adding user to users array
userList.add(user);
} catch (JSONException e) {
e.printStackTrace();
}
}
adapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
hidePDialog();
}
});
//Passing Data to UserDetailActivity
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
int UserDetailActivity = 1;
Intent i = new Intent(UserListActivity.this, UserDetailActivity.class);
i.putExtra("user_id", userList.get(position));
i.putExtra("firstname", userList.get(position));
i.putExtra("lastname", userList.get(position));
startActivityForResult(i, UserDetailActivity);
}
});
}
// Adding request to request queue
AppController.getInstance().addToRequestQueue(userReq);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1 && resultCode == RESULT_OK) {
//Calling the volley method below
volleyRequest();
}
}
//Collapsed volley method, same as onCreate
public void volleyRequest() {...}
UserDetailActivity
//Update Status
private void updateStatus() {
SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
final String user_id = sharedPreferences.getString(Config.user_id,"Not Available");
final String user_status = "ONLINE";
StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.USERSTATUS_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(UserDetailActivity.this, response, Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(UserDetailActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("user_status", user_status);
params.put("user_id", user_id);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
//Calling method below
finishAndSetResult();
//Intent intent = new Intent(this, UserListActivity.class);
//startActivity(intent);
}
private void finishAndSetResult() {
if (getParent() == null) {
setResult(RESULT_OK, null);
} else {
getParent().setResult(RESULT_OK, null);
}
finish();
}
Mise à jour - Solution
Je réalise que j'utilisais deux demandes différentes. (?) Une avec ma classe AppController qui fait la mise à jour immédiate et une autre qui semble attendre jusqu'à ce qu'un autre événement sur le thread d'interface utilisateur a lieu:
// Correct one to use
AppController.getInstance().addToRequestQueue(userReq);
//Delayed
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
Donc, vous chargez un ListView avec une requête GET, puis vous ouvrez une nouvelle activité où vous modifiez l'origine de vos informations (DB) avec une requête POST, mais vous attendez alors que ListView être mis à jour une fois que vous revenez à l'activité qui le détient? Faites-moi savoir si j'ai l'idée de ce qu'est votre problème. – FerDensetsu
Exactement !! J'ai besoin de le mettre à jour immédiatement pour refléter les changements dans la base de données. Est-ce que je ferais quelque chose avec onResume? – glokul
Non, si vous ouvrez une nouvelle activité que vous pensez modifier ou renvoyer un résultat à l'activité qui l'appelle, vous devez faire quelque chose avec onActivityResult. Je vais expliquer dans une réponse. – FerDensetsu