2016-02-25 27 views
9

Bir `ImageView 'özel bir bitmap kümesinin olduğunu doğrulayan bir Espresso eşleştirici yazmak istiyorum. Uygulamanın Glide üzerinden görüntü yüklemesi olduğundan, gerçekte beklenen ve gerçek bitmapleri karşılaştırabilmeden önce, aynı zamanda test tarafımda da kırpmayı/merkezlemeyi hesaba katmam gerektiğini düşündüm. İşteGörüntüyü Glide ile eşzamanlı olarak yükleme

Ben şimdiye kadar geldi budur:

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

Şimdi burada mesele bir kilitlenme olması tabii ki. Ana iş parçacığıyım (eşleştirici ana iş parçacığı IIRC üzerinde çalıştırılır) ve Glide bitmap'i yüklemek için bir arka uç iş parçacığı ister ve sonra ana iş parçacığına ('onResourceReady') kendiliğinden döner. Bu yüzden, ana iş parçacığını devam ettirirken, içeride yayınlanan sonuç için dışarıdan beklemem gerekiyor.

I (başarısız) // ??? içinde Looper.loop() yoluyla cari Lüperin ilerletmek için çalıştı ve aynı zamanda düzenli kilit/bekleme yaklaşımını denedik, ama hiçbir şey çalıştı. Fikirlerim tükendi ...

cevap

-1

Basit bir sleep kullandığım durumlar için en iyi seçenek değil, ama benim için çalışıyor.

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

maalesef sadece tekrar denedim. –

-1

bir yolu onResourceReady, içine Karşılaştırma mantığı tutmak için bunu yapmak Ve herhangi eventbus kullanıyorsanız daha sonra bir sonuçla yarışı tetikleyebilir ve bu olaya abone yöntemi içinde UI mantığı koymak. Herhangi bir olay veriyolu kullanmıyorsanız, yayın sonucuna LocalBroadcastManager yazın. Örneğin

: Bu, bu durumda çalışmıyor

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