Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在活动之间导航时,如何在不加载数据的情况下保留数据_Java_Android_Android Volley - Fatal编程技术网

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