AsyncTask 与 Glide 用于清除缓存

AsyncTask with Glide for clearing Cache

正在抛出错误:

Caused by: java.lang.IllegalArgumentException: You must call this method on the main thread

代码:

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();

我不知道您的用例或应用流程。但是 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

的更多示例

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();
    }
}

试试这个

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

clearDiskCache() 必须在后台线程上调用。
必须在主线程上调用 clearMemory()。
您不能在同一线程上同时调用两者。

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

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