Volley 请求未更新从其他 Activity 返回的数据
Volley Request Not Updating Data Returning From Other Activity
我已经在这个问题上停留了一段时间,所以我终于在寻找一些提示。我的应用程序的 Main Activity 在 Create 上执行 Volley GET 请求,我的 ListView 项目显示正常。单击列表中的一个项目后,我将一些数据传递给另一个 activity,然后我在其中执行 Volley POST 请求来更新我的数据库。然后我被带回我的 Main Activity,之前 selected 的 ListView 项目应该立即更新(从列表中消失或更改 TextViews 等),但它似乎落后了一个周期,如果我select 另一个项目并重复该过程。
我一直在用 onResume 测试各种东西,但我似乎无法让它工作。我什至将整个 volley 请求放在一个方法中并尝试调用它 onResume 但这会导致我的进度对话框挂起并复制列表中的所有内容。但是,由工具栏中的方法调用的列表的手动刷新工作正常,以及来自定时可运行的请求。
用户列表Activity
@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() {...}
用户详细信息Activity
//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();
}
更新-解决方案
所以我意识到我使用了两个不同的请求。一个使用我的 AppController class 进行立即更新,另一个似乎要等到 UI 线程 (?) 上的另一个事件发生:
// Correct one to use
AppController.getInstance().addToRequestQueue(userReq);
//Delayed
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
您应该使用 startActivityForResult:
调用触发 post 请求的 Activity
int POST_ACTIVITY = 1;
Intent i = new Intent(this, PostActivity.class);
startActivityForResult(i, POST_ACTIVITY);
在你的 post activity 中,一旦你知道请求没有错误地发送到服务器,你可以调用下一个方法来完成它并 return 到列表视图activity:
private void finishAndSetResult() {
if (getParent() == null) {
setResult(RESULT_OK, null);
} else {
getParent().setResult(RESULT_OK, null);
}
finish();
}
再次返回您的列表视图 activity,重写方法 Activity 结果:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == POST_ACTIVITY && resultCode == RESULT_OK) {
//Clear any data in your listview, relaunch the get request
//and populate it again
}
}
想通了,更新原版post。事实证明我不需要 startActivityForResult() 或建议的类似内容。感谢您尝试帮助 FerDensetsu :)
我已经在这个问题上停留了一段时间,所以我终于在寻找一些提示。我的应用程序的 Main Activity 在 Create 上执行 Volley GET 请求,我的 ListView 项目显示正常。单击列表中的一个项目后,我将一些数据传递给另一个 activity,然后我在其中执行 Volley POST 请求来更新我的数据库。然后我被带回我的 Main Activity,之前 selected 的 ListView 项目应该立即更新(从列表中消失或更改 TextViews 等),但它似乎落后了一个周期,如果我select 另一个项目并重复该过程。
我一直在用 onResume 测试各种东西,但我似乎无法让它工作。我什至将整个 volley 请求放在一个方法中并尝试调用它 onResume 但这会导致我的进度对话框挂起并复制列表中的所有内容。但是,由工具栏中的方法调用的列表的手动刷新工作正常,以及来自定时可运行的请求。
用户列表Activity
@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() {...}
用户详细信息Activity
//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();
}
更新-解决方案
所以我意识到我使用了两个不同的请求。一个使用我的 AppController class 进行立即更新,另一个似乎要等到 UI 线程 (?) 上的另一个事件发生:
// Correct one to use
AppController.getInstance().addToRequestQueue(userReq);
//Delayed
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
您应该使用 startActivityForResult:
调用触发 post 请求的 Activityint POST_ACTIVITY = 1;
Intent i = new Intent(this, PostActivity.class);
startActivityForResult(i, POST_ACTIVITY);
在你的 post activity 中,一旦你知道请求没有错误地发送到服务器,你可以调用下一个方法来完成它并 return 到列表视图activity:
private void finishAndSetResult() {
if (getParent() == null) {
setResult(RESULT_OK, null);
} else {
getParent().setResult(RESULT_OK, null);
}
finish();
}
再次返回您的列表视图 activity,重写方法 Activity 结果:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == POST_ACTIVITY && resultCode == RESULT_OK) {
//Clear any data in your listview, relaunch the get request
//and populate it again
}
}
想通了,更新原版post。事实证明我不需要 startActivityForResult() 或建议的类似内容。感谢您尝试帮助 FerDensetsu :)