2016-02-26 13 views
6

पर कॉल करना होगा किसी ने पृष्ठभूमि थ्रेड से छवियों को लाने के लिए ग्लाइड का उपयोग किया है?ग्लाइड जोर दें: java.lang.IllegalArgumentException: आपको इस विधि को मुख्य थ्रेड

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

लेकिन इस सूत्र के अनुसार, यह काम करना चाहिए (मुझे लगता है कि):: मैं इस ज़ोर बार आ रही है

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

अभी तक, मैं यह काम करने के लिए जब तक कि मैं से यह फोन नहीं प्राप्त कर सकते हैं, मुख्य धागा

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

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

और mContext सिर्फ गतिविधि "इस" सूचक है

यहाँ क्या मैं मुख्य थ्रेड से ऐसा करने के लिए कोशिश कर रहा हूँ है।

वैसे भी, क्या मैं मुख्य से अलग धागे से ग्लाइड का उपयोग कर सकता हूं?

thx!

+0

अलग थ्रेड में लोड विधि कॉल या कि धागा रन onUi धागा –

+0

आप और अधिक विस्तार से बता सकते हैं नहीं बनाते हैं? मैं इसे ऑनयूआई थ्रेड पर कैसे नहीं चला सकता? मुझे छवि दृश्य पॉइंटर को ग्लाइड करने की आवश्यकता है। यह सूचक मुख्य यूआई थ्रेड से पुनर्प्राप्त किया जाता है। – gmmo

उत्तर

7

Glide की into(ImageView) विधि केवल मुख्य थ्रेड पर कॉल करने के लिए आप की आवश्यकता है, लेकिन जब आप एक टाइमर के लिए लोड हो रहा है पारित यह एक background सूत्र में क्रियान्वित की जाएगी।

आप क्या कर सकते get() बजाय into() को फोन करके एक बिटमैप को पुनः प्राप्त करने के लिए है और फिर सेट कि bitmapImageView पर setImageBitmap() फोन करके।

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

आप अधिक जानकारी के लिए इस document पर एक नज़र ले जा सकते हैं।

2

कोड पोस्ट करना अगर यह किसी की मदद करता है। मुख्य ui सूत्र में

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

छवि अपडेट करें

runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Glide.with(MainActivity.this) 
            .load("image URL") 
            .into(imageView); 
         } 
        }); 
संबंधित मुद्दे