Googleマップでアニメーションのようなビデオを再生しようとしています-マーカーのinfoWindow。以下は完全に機能するものです:
- マーカーの infoWindow 内の UI 画像ビューを更新するハンドラーを使用して、マーカーの infoWindow 内に画像スライド ショー (res/drawable フォルダーに格納されている) を表示できます。
- また、要求に応じてイメージ ビットマップをストリームとして提供するビデオ サーバーを稼働させました。
- また、サーバーからビデオ (一連の画像) を取得してビデオとして再生するモバイル クライアントも開発しました。
今、私が開発したアプリケーション[1]から、保存された画像の代わりに、サーバー[2]から一連の画像(ビデオに属する)をフェッチし、受信した画像をimageViewに設定しようとしています。
私が直面している問題は、新しい画像を取得していて、imageView.setImageBitmap(bt); を呼び出していることです。しかし、ビューを強制的に更新するまで(タッチイベントを介して)imageViewは更新されません
以下は私のコードです:
class RefreshHandler extends Handler {
@Override
public void handleMessage(Message msg) {
BasicMapActivity.this.updateUI();
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
public void updateUI() {
refreshHandler.sleep(200); // Handler type object which makes this function to call as if its on a different thread
Log.d("Update UI - in RUN", "liveOffset : " + liveOffset);
StreamElement se = getNextLiveView();
if (se != null) {
Bitmap bmp = BitmapFactory.decodeByteArray(se.getData(), 0, se.getData().length);
Bitmap bt=Bitmap.createScaledBitmap(bmp, 150, 150, false);
Log.d("Actual Refresh ", "liveOffset : " + liveOffset); // updates inside the above getNextLiveView function that fetches the new image
imageViewK = (ImageView) kv.findViewById(R.id.imageView1);
imageViewK.setImageBitmap(bt); // Received new image is set every time on the imageView
//imageViewK.postInvalidate();
} else{
Bitmap bMap = BitmapFactory.decodeResource(getResources(),
imgidK[1]);
Bitmap bt = Bitmap.createScaledBitmap(bMap, 75, 75, false);
imageViewK.setImageBitmap(bt);
}
}
上記のコードにコメントして、状況を説明しました。これは毎回ログに記録されます (Log.d("Actual Refresh ", "liveOffset : " + liveOffset) with updated liveOffset value) -> つまり、スレッドループ実行で毎回 imageView 設定行に到達できます。ご覧のとおり、imageView.postInvalidate() を使用してみましたが、このメソッドは非 UI スレッドで実行されていると思いますが、それでも imageView は自動的に更新されません。ここで何が間違っていますか?