2017-05-11 2 views
0

Il jette l'erreurAsyncTask avec Glide pour la compensation Cache

Causée par: java.lang.IllegalArgumentException: Vous devez appeler cette méthode sur le thread principal

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

Définition de la priorité sur l'événement click

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

Cela ne peut pas être appelé dans le thread principal car il est aussi jette des erreurs et aussi il ne me laisse pas utiliser asynctask.

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

double possible de [assert Glide: java.lang.IllegalArgumentException: Vous devez appeler cette méthode sur le thread principal] (http://stackoverflow.com/questions/35658806/glide-assert-java-lang- illegalargumentexception-you-must-call-this-method-on-t) –

+0

alors quel est votre problème? – lelloman

+0

@lelloman je veux effacer tous les fichiers de cache sur le bouton cliquez sur – varuog

Répondre

1

clearDiskCache() doit être appelé à partir de fils de fond pendant clearMemory() de fil principal donc:

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

Je ne connais pas votre cas d'utilisation ou votre flux d'applications. Mais doInBackground est spécifiquement utilisé pour effectuer des opérations dans le thread d'arrière-plan par rapport au thread d'interface utilisateur principale.

Maintenant, si vous devez faire des changements correspondant à fil interface utilisateur principal dans doInBackground, puis procédez comme suit

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

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

     return null; 
    } 

Pour plus d'exemples sur runOnUiThread refer this

+0

Non, vous devriez le mettre dans onPostExecute ou surPreExecute –

+0

Yah je suis d'accord. onPostExecute est spécifiquement conçu pour fonctionner dans un thread d'interface utilisateur. Mais que faire si ce type a besoin d'effectuer quelque chose en boucle et sur doInbackground qui mettra à jour le thread de l'interface utilisateur? C'est la première phrase de ma réponse ... que je ne connais pas son cas d'utilisation ou son flux d'applications. Mais s'il veut vraiment mettre à jour l'interface utilisateur dans doInBackground, alors la solution fonctionnera – Stallion

0

Essayez ceci

Les deux méthodes fonctionnent dans des threads différents. ClearDiskCache() doit être appelé sur un thread d'arrière-plan.


clearMemory() doit être appelé sur le thread principal.
Vous ne pouvez pas appeler les deux à la fois sur le même thread.

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

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