如果问题太长,我会提前道歉。我们走了:
MainActivity:
托管GridView
的活动,其中包含产品列表
ProductDetailActivity:
点击后显示GridView
中所选项目详情的活动
ProductMainAdapter:
GridView
。
The workflow:
1 - 用户打开应用程序,主要活动开始(launchMode="singleTask"
),其中包含使用Volley
从服务器查询的产品列表,并列在GridView
中。查询的数据仅包括productID和图像。
2 - 用户点击GridView
上的任何产品(项目),所选产品ID用于从服务器(Volley
)获取详细信息并打开ProductDetailActivity
,意图是选择了产品数据。
3 - 用户查看详细信息并返回MainActivity
并选择其他项目。并继续这样。
此工作流程在%95个用户设备中完美运行。但每隔一段时间我就会收到一条用户的消息,总结说:"第一个点击的产品会在后续点击中保持打开状态"。例如,用户单击项目X,并打开X的详细信息。然后用户转到main并单击项目Y,但项目X再次打开。我在模拟器中使用所有可用的Android版本在过去几周内测试了15到25个版本。我也用我能找到的所有设备对它进行了测试,但是无法重现这个问题。用户发送了一个显示问题的视频,这是一个真正的问题。
Adapter
中的相关代码段如下:
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
...
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openProductDetail(position);
}
});
...
}
private void openProductDetail(int position) {
if(!Connectivity.isConnected(getContext())) {
CommonUtil.buildDialog(getContext(), getContext().getResources().getString(R.string.no_network_title),
getContext().getResources().getString(R.string.no_network_msg)).show();
return;
}
try {
ImageRecord imr = getItem(position);
String productID = imr != null ? imr.getId() : "0";
getProductDetail(productID);
} catch (Exception e) {
Log.e("openProductDetail", "exception", e);
}
}
private void getProductDetail(final String productID) {
...
StringRequest postRequest = new StringRequest(Request.Method.POST, Config.PRODUCT_DETAIL_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
if(response != null && !response.equals("")) {
Intent intent = new Intent(getContext(), ProductDetailActivity.class);
intent.putExtra("pid", productID);
intent.putExtra("jsonObject", response);
getContext().startActivity(intent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
}
) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<>();
params.put("id", productID);
...
return params;
}
};
RetryPolicy policy = new DefaultRetryPolicy(1000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
postRequest.setRetryPolicy(policy);
CustomVolleyRequest.getInstance(getContext()).getRequestQueue().add(postRequest);
}
ProductDetailActivity代码是:
protected void onResume() {
super.onResume();
...
productID = getIntent().getStringExtra("pid");
jsonObject = getIntent().getStringExtra("jsonObject");
...
}
由于我无法重现该问题,因此无法对其进行调试。我可以要求用户给我他们的手机进行测试,他们住在另一个国家。
GridView
正在缓存第一次点击并继续返回,或者产品详细信息活动因某种原因兑现其数据。我尝试使用onItemClickListener()
的{{1}}但是没有用。我还尝试仅将productID发送到详细活动并从新活动中删除详细信息。那也行不通。有没有人遇到类似的情况?任何建议或评论都非常感谢。
谢谢