Java 在活动之间导航时,如何在不加载数据的情况下保留数据
如何防止来自其他目的的数据再次加载。例如,我有一个Java 在活动之间导航时,如何在不加载数据的情况下保留数据,java,android,android-volley,Java,Android,Android Volley,如何防止来自其他目的的数据再次加载。例如,我有一个MainActivity,我在onCreate()方法中调用API。我单击其中一张卡,它会触发另一个名为CardActivity的活动 当我从此CardActivity回击时,数据再次被加载。我也尝试了onPause()方法,但运气不好。如何防止在活动之间导航时加载的数据 谁能指导我如何做到这一点 我正在使用Volley库进行HTTP调用 @Override protected void onCreate(Bundle savedInst
MainActivity
,我在onCreate()
方法中调用API。我单击其中一张卡,它会触发另一个名为CardActivity
的活动
当我从此CardActivity
回击时,数据再次被加载。我也尝试了onPause()
方法,但运气不好。如何防止在活动之间导航时加载的数据
谁能指导我如何做到这一点
我正在使用Volley库进行HTTP调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestQueue = MySingleton.getInstance(this.getApplicationContext()).getRequestQueue();
getRedditDefaultData();
getGoogleHeadlinesData();
}
private void getRedditDefaultData() {
final String url = "https://example.com"
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
...
dataset.add(new StaggeredCustomCard(
redditUserProfilePic,
redditUserName,
redditPostDateTime,
redditPostTitle,
null,
redditPostDescription));
}
if (dataset != null) {
staggeredGridAdapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO: Handle error
progressBar.setVisibility(View.GONE);
}
});
retryPolicy(jsonObjectRequest);
MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest);
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestQueue=MySingleton.getInstance(this.getApplicationContext()).getRequestQueue();
getRedditDefaultData();
getGoogleHeadlinesData();
}
私有void getRedditDefaultData(){
最终字符串url=”https://example.com"
JsonObjectRequest JsonObjectRequest=新JsonObjectRequest
(Request.Method.GET,url,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
...
dataset.add(新的交错客户卡)(
雷迪图塞尔皮克,
redditUserName,
redditPostDateTime,
redditPostTitle,
无效的
redditPostDescription);
}
如果(数据集!=null){
staggedGridAdapter.notifyDataSetChanged();
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//TODO:句柄错误
progressBar.setVisibility(View.GONE);
}
});
retryPolicy(jsonObjectRequest);
getInstance(this).addToRequestQueue(jsonObjectRequest);
}
这个问题有很多可能的答案。您可以将数据本地存储在SQLite数据库中,然后在需要时从那里读取数据。如果您的数据可能经常更改,那么这不是一个好主意。您可以考虑使用随<代码>凌空的缓存系统。要了解缓存将如何实现,您可以参考
另一种方法是将数据作为对象在活动之间传递。如果数据在活动转换期间不太可能更改,我认为这是一个好主意。这样,您就不会每次都从网络加载数据。因此,一旦在<代码>主活动< /代码>中读取数据,它就可以作为一个对象或意图传递给<代码> CARDActudio。 这将导致调用onNewIntent()而不是onCreate() 奥涅温特 在API级别1中添加 受保护的void onNewIntent(意图) 这是为在中将launchMode设置为“singleTop”的活动调用的 他们的软件包,或者如果客户使用了Intent#FLAG(标志)ACTIVITY(活动)SINGLE(顶部) 调用startActivity(意图)时的标志。无论哪种情况,当 活动在活动堆栈顶部重新启动 对于正在启动的活动的新实例,onNewIntent()将 以用于 重新启动它 在恢复状态下,活动永远无法接收新的意图。你 可以指望在此方法之后调用onResume(),但不是 必须在完成此回调后立即执行。如果 活动已恢复,它将暂停,并显示新的意图 已交付,然后是onResume()。如果活动不在 恢复状态,则可以立即交付新的意图,并且 onResume()稍后在活动再次激活时调用 请注意,getIntent()仍然返回原始意图。你可以用 setIntent(Intent)将其更新为新的Intent
以下是我根据@Reaz Murshed的建议所做的尝试。这在媒体上帮助我实现了缓存方法
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
...
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
...
}
}) {
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
Cache.Entry cacheEntry = HttpHeaderParser.parseCacheHeaders(response);
if (cacheEntry == null) {
cacheEntry = new Cache.Entry();
}
final long cacheHitButRefreshed = 3 * 60 * 1000; // in 3 minutes cache will be hit, but also refreshed on background
final long cacheExpired = 24 * 60 * 60 * 1000; // in 24 hours this cache entry expires completely
long now = System.currentTimeMillis();
final long softExpire = now + cacheHitButRefreshed;
final long ttl = now + cacheExpired;
cacheEntry.data = response.data;
cacheEntry.softTtl = softExpire;
cacheEntry.ttl = ttl;
String headerValue;
headerValue = response.headers.get("Date");
if (headerValue != null) {
cacheEntry.serverDate = HttpHeaderParser.parseDateAsEpoch(headerValue);
}
headerValue = response.headers.get("Last-Modified");
if (headerValue != null) {
cacheEntry.lastModified = HttpHeaderParser.parseDateAsEpoch(headerValue);
}
cacheEntry.responseHeaders = response.headers;
final String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString), cacheEntry);
} catch (UnsupportedEncodingException | JSONException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(JSONObject response) {
super.deliverResponse(response);
}
@Override
public void deliverError(VolleyError error) {
super.deliverError(error);
}
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
return super.parseNetworkError(volleyError);
}
};
JsonObjectRequest JsonObjectRequest=新JsonObjectRequest
(Request.Method.GET,url,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
...
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
...
}
}) {
@凌驾
受保护的响应parseNetworkResponse(NetworkResponse响应){
试一试{
Cache.Entry cacheEntry=HttpHeaderParser.parseCacheHeaders(响应);
if(cacheEntry==null){
cacheEntry=new Cache.Entry();
}
final long cachehitbutrefresh=3*60*1000;//3分钟后将命中缓存,但也会在后台刷新
最终长缓存过期=24*60*6