2016-02-25 17 views
9

के साथ सिंक्रनाइज़ छवि को लोड करना मैं एक एस्प्रेसो मैचर लिखना चाहता हूं जो सत्यापित करता है कि 'ImageView' का एक विशिष्ट बिटमैप सेट है। चूंकि ऐप ग्लाइड के माध्यम से छवियों की लोडिंग करता है, मैंने सोचा कि मुझे वास्तव में अपेक्षित और वास्तविक बिटमैप्स की तुलना करने से पहले क्रॉपिंग/सेंसरिंग के लिए परीक्षण पक्ष पर ऐसा करना होगा।ग्लाइड

यहाँ मैं अब तक के साथ आया है:

BitmapRequestBuilder<Uri, Bitmap> bitmapRequest = Glide.with(imageView.getContext()) 
     .load(Uri.parse("file:///android_asset/" + mPath)) 
     .asBitmap(); 

switch (imageView.getScaleType()) { 
    case CENTER_CROP: 
     bitmapRequest.centerCrop(); 
     break; 
    case FIT_CENTER: 
    case FIT_START: 
    case FIT_END: 
     bitmapRequest.fitCenter(); 
     break; 
    default: 
     // no scaling applied to the ImageView under test 
} 

AtomicReference<Bitmap> bmRef = new AtomicReference<>(); 
bitmapRequest.into(new SimpleTarget<Bitmap>(
      imageView.getMeasuredWidth(), 
      imageView.getMeasuredHeight() 
) { 
    @Override 
    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
     bmRef.set(resource); 
    } 
}); 

// ??? 

try { 
    Bitmap expected = bmRef.get(); 
    return expected.sameAs(bitmap); 
} catch (Exception e) { 
    throw new IllegalStateException("could not load asset " + mPath, e); 
} 

अब यहां मुद्दा यह है कि मैं एक गतिरोध है निश्चित रूप से है। मैं मुख्य धागे पर हूं (मैचर मुख्य थ्रेड आईआईआरसी पर निष्पादित किया गया है) और ग्लाइड बैकएंड थ्रेड को बिटमैप लोड करने के लिए चाहता है और फिर मुख्य थ्रेड ('ऑन रिसोर्स रीडी' में) पर लौटता है। इसलिए मुझे मुख्य थ्रेड चलते समय, अंदर के अंदर पोस्ट किए गए परिणाम के लिए बाहरी से प्रतीक्षा करने की आवश्यकता है।

I (असफल) ने Looper.loop() के माध्यम से // ??? में वर्तमान लूपर को अग्रिम करने की कोशिश की और नियमित लॉक/प्रतीक्षा दृष्टिकोण भी कोशिश की, लेकिन कुछ भी काम नहीं किया। मैं विचारों से बाहर हूं ...

उत्तर

-1

ऐसे मामलों के लिए मैं एक साधारण sleep का उपयोग करता हूं, यह सबसे अच्छा विकल्प नहीं है, लेकिन यह मेरे लिए काम करता है।

public static void waitForActivity(long time) { 
    try { 
     Thread.sleep(time); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
+0

यह इस मामले में काम नहीं करता है, दुर्भाग्य से, बस इसे फिर से कोशिश की। –

-1

एक तरह से यह करने के लिए onResourceReady, अंदर अपनी तुलना तर्क रखने के लिए और फिर अगर आप किसी भी eventbus उपयोग कर रहे हैं तो परिणाम के साथ घटना को ट्रिगर और तरीका है जो इस घटना का सदस्य बनता अंदर यूआई तर्क डाल दिया। यदि किसी भी ईवेंट बस का उपयोग नहीं किया जाता है तो परिणाम प्रसारित करने के लिए LocalBroadcastManager

उदाहरण के लिए:

private BroadcastReceiver receiver; 

private void doWhateverYouWantWithResult(boolean result) { 

} 

bitmapRequest.into(new SimpleTarget<Bitmap>(
      imageView.getMeasuredWidth(), 
      imageView.getMeasuredHeight() 
) { 
    @Override 
    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
     bmRef.set(resource); 
     Bitmap expected = resource; 
     boolean result = expected.sameAs(bitmap); 
     Intent localIntent = 
       new Intent(BROADCAST_ACTION) 
         // Puts the status into the Intent 
         .putExtra(MATCH_RESULT, result); 
     // Broadcasts the Intent to receivers in this app. 
     LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent); 
    } 
}); 


    @Override 
    public void onResume(){ 
     super.onResume(); 
     receiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       boolean result = intent.getBooleanExtra(MATCH_RESULT); 
       doWhateverYouWantWithResult(result); 
      } 
     }; 
     LocalBroadcastManager.getInstance(getContext()) 
       .registerReceiver(receiver, new IntentFilter(BROADCAST_ACTION)); 
    } 

    @Override 
    public void onPause(){ 
     super.onPause(); 
     LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(receiver); 
    } 
संबंधित मुद्दे