2016-02-26 6 views
6

jemand benutzt glide, um Bilder aus einem Hintergrund-Thread zu holen? Ich erhalte diese assert:Glide-Assert: java.lang.IllegalArgumentException: Sie müssen diese Methode auf dem Hauptthread aufrufen

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

aber nach diesem Thread, sollte es funktionieren (ich glaube):

https://github.com/bumptech/glide/issues/310

noch, ich kann sie nicht arbeiten, es sei denn, ich nenne es aus der Hauptfaden.

Hier ist das, was ich versuche, aus dem Haupt-Thread zu tun:

Glide.get(mContext); 
    loadUserImage(userImageUrl); 

    // wait 5 seconds before trying again 
    int imageLoadingTimeOut = mContext.getResources().getInteger(R.integer.image_loading_time_out); 
    if (imageLoadingTimeOut > 0) { 
     new Timer().schedule(new TimerTask() { 
      @Override 
      public void run() { 
       if (!mUserImageLoaded) { 
        loadUserImage(userImageUrl); 
       } 
      } 
     }, imageLoadingTimeOut); 
    } 
} 

und die loadUserImage:

private boolean mUserImageLoaded = false; 

private void loadUserImage(String userImageUrl) { 

    if (userImageUrl != null && !userImageUrl.isEmpty() && !mUserImageLoaded) { 
     Glide.with(mContext).using(Cloudinary.getUrlLoader(mContext)).load(userImageUrl).crossFade().listener(new RequestListener<String, GlideDrawable>() { 

      @Override 
      public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
       return false; 
      } 

      @Override 
      public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
       mImageMessageContent.invalidate(); 
       mUserImageLoaded = true; 
       return false; 
      } 
     }).into(mImageMessageContent); 

    } else { 
     mImageMessageContent.setVisibility(View.GONE); 
    } 
} 

und mContext ist nur die Aktivität "dieser" Zeiger.

Wie auch immer, kann ich Glide von einem anderen Thread als Haupt verwenden?

thx!

+0

nicht Load-Methode in separaten Thread aufrufen oder das Fadenlauf ONUi Thread machen –

+0

können Sie mehr näher erläutern? Wie kann ich verhindern, dass es auf einem onUI-Thread ausgeführt wird? Ich muss den ImageView-Zeiger übergeben, um zu gleiten. Dieser Zeiger wird vom Haupt-UI-Thread abgerufen. – gmmo

Antwort

7

Die into(ImageView) Methode von Glide erfordert, dass Sie es auf Hauptthread nur zu nennen, aber wenn Sie das Laden an einen Timer passieren wird es in einem background Thread ausgeführt werden.

Was Sie tun können, ist eine Bitmap abzurufen, indem get() statt into() Aufruf und stellen Sie dann, dass bitmap auf dem ImageView von setImageBitmap() aufrufen.

Glide.with(getApplicationContext()) 
    .load("your url") 
    .asBitmap() 
    .into(new BitmapImageViewTarget(imgView) { 
     @Override 
     protected void setResource(Bitmap resource) { 
     //Play with bitmap 
     super.setResource(resource); 
     } 
    }); 

können Sie auch einen Blick auf diese für weitere Informationen document.

2

Den Code eingeben, nur für den Fall, dass es jemand hilft.

Bitmap myBitmap = Glide.with(applicationContext) 
     .load(yourUrl) 
     .asBitmap() 
     .centerCrop() 
     .into(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL) 
     .get() 
imageView.setImageBitmap(myBitmap); 
0

Update-Bild in Haupt ui Thread

runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Glide.with(MainActivity.this) 
            .load("image URL") 
            .into(imageView); 
         } 
        });