【问题标题】:AsyncTask with Glide for clearing Cache带有 Glide 的 AsyncTask 用于清除缓存
【发布时间】:2017-05-11 05:48:38
【问题描述】:

它正在抛出一个错误:

原因: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();

【问题讨论】:

标签: android android-asynctask android-glide


【解决方案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();
    }
}

【讨论】:

    【解决方案2】:

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

    现在如果您需要在doInBackground 中进行与Main UI thread 对应的更改,请执行以下操作

    @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 的更多示例

    【讨论】:

    • 不,你应该把它放在 onPostExecute 或 onPreExecute
    • 是的,我同意。 onPostExecute 专门用于在 UI 线程中执行。但是,如果这个人需要在循环基础上执行某些操作并在 doInbackground 上更新 UI 线程怎么办?这是我回答的第一句话……我不知道他的用例或应用程序流程。但是如果他真的想在doInBackground中更新UI,那么解决方案就可以了
    【解决方案3】:

    试试这个

    这两种方法都在不同的线程中工作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2011-08-08
      • 2017-08-25
      • 1970-01-01
      • 2018-03-14
      • 2022-01-03
      相关资源
      最近更新 更多