2016-02-25 23 views
9

Tôi muốn viết một trình so khớp Espresso xác minh rằng một `ImageView 'có một tập bitmap cụ thể. Kể từ khi ứng dụng tải hình ảnh qua Glide, tôi nghĩ rằng tôi phải làm tương tự ở phía thử nghiệm để tính toán cắt xén/định tâm trước khi tôi thực sự có thể so sánh các bitmap dự kiến ​​và thực tế.Đang tải hình ảnh đồng bộ với Glide

Dưới đây là những gì tôi đã đưa ra cho đến nay:

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

Bây giờ vấn đề ở đây là tất nhiên là tôi có một bế tắc. Tôi đang trên thread chính (matcher được thực hiện trên chủ đề chính IIRC) và Glide muốn một chuỗi phụ trợ để tải bitmap và sau đó trả về trên chính thread (trong 'onResourceReady') chính nó. Vì vậy, tôi cần phải chờ đợi từ bên ngoài cho kết quả được đăng trên bên trong, trong khi vẫn giữ thread chính chạy.

I (không thành công) đã cố gắng nâng cấp số looper hiện tại qua Looper.loop() trong // ??? và cũng đã thử phương pháp khóa/chờ thông thường, nhưng không có tác dụng. Tôi không có ý tưởng ...

Trả lời

-1

Đối với các trường hợp như thế tôi sử dụng một đơn giản sleep, nó không phải là lựa chọn tốt nhất, nhưng nó hoạt động cho tôi.

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

này không hoạt động trong trường hợp này, không may, chỉ cần thử nó một lần nữa. –

-1

Một cách để làm điều này để giữ so sánh logic của bạn bên onResourceReady, Và sau đó nếu bạn đang sử dụng bất kỳ eventbus sau đó kích hoạt sự kiện với kết quả và đưa UI logic bên trong phương pháp mà đặt mua đến sự kiện này. Nếu không sử dụng bất kỳ xe buýt sự kiện nào thì LocalBroadcastManager để phát sóng kết quả.

Ví dụ:

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); 
    } 
Các vấn đề liên quan