2016-02-25 26 views
9

「ImageView」に特定のビットマップが設定されていることを確認するエスプレッソマッチャーを作成します。アプリはグライド経由で画像を読み込んでいるので、実際に予想されるビットマップと実際のビットマップを比較する前に、クロップ/センタリングを考慮してテスト側で同じことをしなければならないと思った。ここでイメージをGlideと同時にロードする

は、私がこれまでに思い付いたものです:

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

は、今ここでの問題は、私がデッドロックを持っていることはもちろんです。私はメインスレッド(matcherはメインスレッドIIRCで実行されます)にあり、Glideはバックエンドスレッドにビットマップをロードさせ、メインスレッド( 'onResourceReady'内)に戻ります。だから私はメインスレッドを実行したままで、内部に掲載されている結果を外部から待つ必要があります。

Looper.loop()で現在のルーパーを// ???に進めようとしましたが、通常のロック/ウェイトアプローチを試みましたが、何も機能しませんでした。私はアイデアがありません...

答えて

-1

私は単純なsleepを使用しているような場合は、それは最善の選択肢ではありませんが、それは私のために働く。あなたはどんなeventbusを使用している場合、結果にイベントをトリガし、このイベントをサブスクライブするメソッド内でUIロジックを入れ、その後

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

これは、このケースでは動作しません、残念ながら、もう一度それを試してみました。 –

-1

onResourceReadyの内側にあなたの比較ロジックを維持するためにこれを行う方法の1つは、 をと。イベントバスを使用していない場合は、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); 
    } 
関連する問題