Как при выходе из приложения очищать кеш приложения?

350
23 мая 2017, 01:41

Есть приложение, которое обращается к файлу json, который лежит на хостинге, чтоб получить список радиостанций. Если я добавлю в файл json какую либо информацию, например еще одну радиостанцию там пропишу, то в приложении не обновляются данные, а всё отображается по старому.

Новая радиостанция отображается только если зайти в настройки телефона,а далее в настройки приложения, и руками очистить кеш и данные у приложения. Тогда снова зайдя в приложение, - оно загрузит заново файл json и отобразит мне обновленный список с радиостанциями.

Как сделать так, чтоб кеш либо чистился при выходе из приложения, либо обновлять данные с файла json при каком либо событии, например зашел в другое активити - вернулся обратно и всё обновилось.

p.s: файл json лежит на хостинге у ucoz., но думаю это не из за этого.

p.p.s: проверил с другим хостингом., всё работает как надо!. в чем проблема у юкоза? по FTP также заливаю file.json , но не обновляет список в приложении, при изменении файла и перезаливке его обратно на юкоз...

Например, я цепляю на снекбар слушатель кнопки:

        Snackbar.make(parentPanel, "TEST", Snackbar.LENGTH_INDEFINITE)
                .setAction(R.string.refresh_list, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Здесь нужно каким то образом реализовать перезагрузку файла .json, чтобы он заново загрузился в приложение.
                        Либо зачистить кеш приложения (незнаю возможно ли это, не получив при этом краш приложения какой нибудь...

                    }
                }).show();

Здесь как я понимаю парсится json:

public class UtilFunctions {
    static String LOG_CLASS = "UtilFunctions";
    /**
     * Check if service is running or not
     * @param serviceName
     * @param context
     * @return
     */
    public static boolean isServiceRunning(String serviceName, Context context) {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for(RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if(serviceName.equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
    public static ArrayList<Track.TrackDetails> getSongsList(){
        ArrayList<Track.TrackDetails> mArrTrackList = new ArrayList<Track.TrackDetails>();
        if(PlayerConstants.SONGS_LIST!=null)
        {
            for (int i = 0; i < PlayerConstants.SONGS_LIST.size(); i++) {
                if (PlayerConstants.SONGS_LIST.get(i).getGenre().equalsIgnoreCase(PlayerConstants.CATEGORY)) {
                    mArrTrackList.add(PlayerConstants.SONGS_LIST.get(i));
                }
            }
        }
        return mArrTrackList;
    }

    /**
     * Read the songs present in external storage
     * @param context
     * @return
     */

    public static Track jsonParesing(Context context,String response) {
        // TODO Auto-generated method stub
        Track mObjTrack = new Track();
        ArrayList<Track.TrackDetails> mArrAllTrackDetails = new ArrayList<Track.TrackDetails>();
        try {
            response = URLDecoder.decode(URLEncoder.encode(response, "iso8859-1"),"UTF-8");
            JSONArray jsonArray = new JSONArray(response);
            for (int i = 0; i < jsonArray.length(); i++) {
                Track.TrackDetails trackDetails = new Track.TrackDetails();
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                trackDetails.setId(jsonObject.getString(context.getString(R.string.key_id)));
                trackDetails.setTitle(jsonObject.getString(context.getString(R.string.key_title)));
                trackDetails.setUser_id(jsonObject.getString(context.getString(R.string.key_user_id)));
                trackDetails.setLabel_name(jsonObject.getString(context.getString(R.string.key_label_name)));
                trackDetails.setGenre(jsonObject.getString(context.getString(R.string.key_genre)));
                trackDetails.setDescription(jsonObject.getString(context.getString(R.string.key_description)));
                trackDetails.setDownloadable(jsonObject.getBoolean(context.getString(R.string.key_downloadable)));
                trackDetails.setStreamable(jsonObject.getBoolean(context.getString(R.string.key_streamable)));
                if (jsonObject.getString(context.getString(R.string.key_tag_list)) != null) {
                    trackDetails.setTag_list(jsonObject.getString(context.getString(R.string.key_tag_list)));
                }
                if (jsonObject.getString(context.getString(R.string.key_duration)) != null) {
                    trackDetails.setDuration(jsonObject.getString(context.getString(R.string.key_duration)));
                }
                if (jsonObject.getString(context.getString(R.string.key_created_at)) != null) {
                    trackDetails.setCreated_at(jsonObject.getString(context.getString(R.string.key_created_at)));
                }
                if (jsonObject.getString(context.getString(R.string.key_permalink_url)) != null) {
                    trackDetails.setPermalink_url(jsonObject.getString(context.getString(R.string.key_permalink_url)));
                }

        if (jsonObject.getString(context.getString(R.string.key_artwork_url)) != null) {
                trackDetails.setArtwork_url(jsonObject.getString(context.getString(R.string.key_artwork_url)));
            }
            if (jsonObject.getString(context.getString(R.string.key_stream_url)) != null) {
                trackDetails.setStream_url(jsonObject.getString(context.getString(R.string.key_stream_url)));
            }
            if (!jsonObject.isNull(context.getString(R.string.key_download_url))) {
                if (jsonObject.getString(context.getString(R.string.key_download_url)) != null) {
                    trackDetails.setDownload_url(jsonObject.getString(context.getString(R.string.key_download_url)));
                }
            }
            mArrAllTrackDetails.add(trackDetails);
        }
        mObjTrack.setTrackDetails(mArrAllTrackDetails);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.d("myLog", response);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    PlayerConstants.OBJ_TRACK = mObjTrack;
    return mObjTrack;
}

/**
 * Get the album image from albumId
 * @param context
 * @param album_id
 * @return
 */
public static Bitmap getAlbumart(Context context,Long album_id){
    Bitmap bm = null;
    BitmapFactory.Options options = new BitmapFactory.Options();
    try{
        final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
        Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
        ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
        if (pfd != null){
            FileDescriptor fd = pfd.getFileDescriptor();
            bm = BitmapFactory.decodeFileDescriptor(fd, null, options);
            pfd = null;
            fd = null;
        }
    } catch(Error ee){}
    catch (Exception e) {}
    return bm;
}
/**
 * @param context
 * @return
 */
/**
 * Convert milliseconds into time hh:mm:ss
 * @param milliseconds
 * @return time in String
 */
public static String getDuration(long milliseconds) {
    long sec = (milliseconds / 1000) % 60;
    long min = (milliseconds / (60 * 1000))%60;
    long hour = milliseconds / (60 * 60 * 1000);
    String s = (sec < 10) ? "0" + sec : "" + sec;
    String m = (min < 10) ? "0" + min : "" + min;
    String h = "" + hour;
    String time = "";
    if(hour > 0) {
        time = h + ":" + m + ":" + s;
    } else {
        time = m + ":" + s;
    }
    return time;
}
public static boolean currentVersionSupportBigNotification() {
    int sdkVersion = android.os.Build.VERSION.SDK_INT;
    if(sdkVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN){
        return true;
    }
    return false;
}
public static boolean currentVersionSupportLockScreenControls() {
    int sdkVersion = android.os.Build.VERSION.SDK_INT;
    if(sdkVersion >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH){
        return true;
    }
    return false;
}

}

и в главном Activity:

   private String getRequest() {
        // TODO Auto-generated method stub
        String tag_json_obj = "json_obj_req";
        RequestQueue queue = Volley.newRequestQueue(this);
        StringRequest sr = new StringRequest(Request.Method.GET, Config.URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                StrResponse = response.toString();
                Log.d(TAG, "StrResponse : " + StrResponse);
                mObjTrack=UtilFunctions.jsonParesing(getApplicationContext(),StrResponse);
                mArrAllTrackDetails = mObjTrack.getTrackDetails();
                setUpCategoryList();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.e(TAG, "Error: " + error.getMessage());
            }
        });
        DiskBasedCache cache = new DiskBasedCache(getCacheDir(), 16 * 1024 * 1024);
        queue = new RequestQueue(cache, new BasicNetwork(new HurlStack()));
        queue.start();
        // clear all volley caches.
        queue.add(new ClearCacheRequest(cache, null));
        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(sr, tag_json_obj);
        return StrResponse;
    }
    private void setUpCategoryList() {
        // TODO Auto-generated method stub
        //displayMusicPlayerControl();
        textView_title.setVisibility(View.VISIBLE);
        listView_Category.setVisibility(View.VISIBLE);
        // Remove Duplicate
        ArrayList<String> tempArrCategory = new ArrayList<String>();
        if (mArrAllTrackDetails != null) {
            tempArrCategory.clear();
            for (int i = 0; i < mArrAllTrackDetails.size(); i++) {
                tempArrCategory.add(mArrAllTrackDetails.get(i).getGenre());
            }
        }
        ArrayList<Category> category = new ArrayList<Category>();
        if (tempArrCategory != null) {
            // add elements to tempArrCategory, including duplicates
            HashSet<String> hs = new HashSet<String>();
            hs.addAll(tempArrCategory);
            mArrCategory.clear();
            mArrCategory.addAll(hs);
            Category category1;
            for(int i =0;i<mArrCategory.size();i++)
            {
                category1 = new Category();
                category1.setCategory(mArrCategory.get(i));
                for (int j = 0; j < mArrAllTrackDetails.size(); j++) {
                    if(mArrAllTrackDetails.get(j).getGenre().equalsIgnoreCase(category1.getCategory()))
                    {
                        category1.setIcon(mArrAllTrackDetails.get(j).getArtwork_url());
                    }
                }

                category.add(category1);
            }
        }
        if (mArrCategory != null) {
            // Log.d(TAG, "mArrCategory.size() : " + mArrCategory.size());
            GridLayoutManager gridLayoutManagerVertical =
                    new GridLayoutManager(this,
                            mColumns, //The number of Columns in the grid
                            LinearLayoutManager.VERTICAL,
                            false);
            LinearLayoutManager  mLayoutManager = new LinearLayoutManager(getApplicationContext());
            listView_Category.setHasFixedSize(true);
            mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            listView_Category.setLayoutManager(gridLayoutManagerVertical);
            listView_Category.setItemAnimator(new DefaultItemAnimator());
            listView_Category.setAdapter(new CategoryAdapter(category));
        }
        displayMusicPlayerControl();
    }
Answer 1
  1. Если статика сервером отдаётся с expires хедером, то возможно старая версия отдаётся. Такой часто бывает, если cdn используется. Я не в курсе как в этом плане ucoz работает.
  2. Каким образом вы качаете? Библиотеки многие имеют свойство кешировать контент. Опять же, если файл отдаётся с expires хедером, то клиент может кешировать данные до тех пор, пока не истечёт время жизни. Во многих либах это обходится явным указанием инвалидации кеша хедерами.

Что-то вроде такого:

req.setRequestHeader("Cache-Control", "max-age=0, no-cache, no-store");
req.setRequestHeader("Pragma", "no-cache");

У Volley можно ручками инвалидировать кеш для запроса:

AppController.getInstance().getRequestQueue().getCache().invalidate(url, true);

или так:

AppController.getInstance().getRequestQueue().getCache().remove(url);
READ ALSO
Как правильно сделать навигацию на view в Vaadin?

Как правильно сделать навигацию на view в Vaadin?

Не могу понять, как правильно сделать навигацию на вью через спрингВроде сделал все четко по этому примеру http://vaadin

362
Вывод из бд в строковый массив

Вывод из бд в строковый массив

Имеется база данных содержащая столбец с названиямиКаким образом можно вывести данные из БД в массив, а потом из этого массива заполнить...

219
Hibernate Lazy initialization в Master - Detail отображении

Hibernate Lazy initialization в Master - Detail отображении

Имеется схема БД (Упрощаю) в которой есть две таблицы назовем их Накладная и Товары_НакладнойНа клиенте (JavaFX) у меня два TableView Master и Detail

271
Проблемка в Android SDK Studio после переделывания в apk

Проблемка в Android SDK Studio после переделывания в apk

В общем, я написал программу и при проверке эмулятором - она работаетВ ней есть два Activity, с кнопками

282