使用Glide的AsyncTask清除缓存

时间:2017-05-11 05:48:39

标签: android android-asynctask android-glide

投掷错误

  

引起:java.lang.IllegalArgumentException:您必须调用它   主线程上的方法

Class CacheClearAsyncTask extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... params) {
        Glide.get(getActivity()).clearDiskCache();
        Glide.get(getActivity()).clearMemory();

        return null;
    }

    @Override
    protected void onPostExecute (Void result)
    {
        //Toast.makeText(getActivity(), "Cache cleared", Toast.LENGTH_LONG).show();
    }
}

设置点击事件的首选项

clearCacheBtnPref=findPreference(getResources().getString(R.string.pref_btn_clear_cache_key));
    clearCacheBtnPref.setOnPreferenceClickListener(new 

Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                    new CacheClearAsyncTask().execute();
                    return true;
                }
            });

这不能在主线程中调用,因为它也会抛出错误,也不会让我使用asynctask。

    Glide.get(getActivity()).clearDiskCache();
    Glide.get(getActivity()).clearMemory();

3 个答案:

答案 0 :(得分:1)

必须从后台线程调用

clearDiskCache(),而clearMemory()来自主线程,所以:

class CacheClearAsyncTask extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... params) {
        Glide.get(getActivity()).clearDiskCache();    
        return null;
    }

    @Override
    protected void onPostExecute (Void result)    {
        Glide.get(getActivity()).clearMemory();
    }
}

答案 1 :(得分:0)

我不知道您的用例或应用流程。但是doInBackground专门用于在后台线程中进行操作而不是主UI线程。

现在,如果您需要在doInBackground中执行与主UI线程相对应的更改,请执行以下操作

@Override
    protected Void doInBackground(Void... params) {
        getActivity().runOnUiThread(new Runnable() {
                       @Override
                       public void run() {

                            Glide.get(getActivity()).clearDiskCache();
                            Glide.get(getActivity()).clearMemory();
                       }
                   });

        return null;
    }

有关runOnUiThread refer this

的更多示例

答案 2 :(得分:0)

试试这个

两种方法都适用于不同的线程。

必须在后台线程上调用clearDiskCache() 必须在主线程上调用clearMemory() 你不能在同一个线程上同时调用它们。

void clearGlideCache()
{
    new Thread() 
    {
        @Override
        public void run() 
        {
            Glide.get(DemoActivity.this).clearDiskCache();
        }
    }.start();

    Glide.get(DemoActivity.this).clearMemory();
}