ImageViewで画像を入れ替えても更新されない

1,763 views
Skip to first unread message

ゲルググ

unread,
Oct 22, 2013, 4:13:00 AM10/22/13
to android-g...@googlegroups.com
こんにちは、ゲルググです。

ImageViewを500msec間隔で画像を切り替える処理を実装中です。
ところが画像が切り替わらないため、困っています。

処理内容は、
 1.Activity生成時にImageViewにOFF画像をセットする                             ←表示されます。
 2.別スレッドにて、500msec後にImageViewにON画像をセットする処理をUIスレッドへポストする    ←表示されます。
 3.続いて、さらに500msec後にImageViewにOFF画像をセットする処理をUIスレッドへポストする    ← ×表示されない(画面はON画像のまま)

やったこと
 試しにImageViewを継承してonDraw()メソッドをオーバーライドしたところ、
 3の時も呼ばれていることは確認しました。
 なので、UIスレッドに処理がわたっているはずだと思うのですが、3が更新されません。

 当然、invalidate()つけてもダメでした。

ここで質問なのですが、
 ・なぜImageViewが更新されないのでしょうか?
 ・「onDraw()==実際に描画される」ではないのでしょうか?

よろしくお願いします。

ソースコードを抜粋しました。

=================================================
// Activity生成
void onCreate() {

// 最初はoff画像を描画しておく
imageView.setImageResource(R.drawable.off);

new Thread(new Runnable() {
@Override
public void run() {

// 500msec後にon画像を描画
CountDownLatch signal1 = new CountDownLatch(1);
handler.postDelayed(new DrawImageView(imageView, signal1, true), 500);
signal1.await();

// 500msec後にoff画像を描画
CountDownLatch signal2 = new CountDownLatch(1);
handler.postDelayed(new DrawImageView(imageView, signal2, false), 500);
signal2.await();

}
}).start();

}

// ImageView描画処理
class DrawImageView implements Runnable {

private ImageView view;
private CountDownLatch signal;
private boolean flag;

public DrawImageView(ImageView v, CountDownLatch s, boolean f) {
view = v;
signal = s;
flag = f;
}

@Override
public void run() {
if (flag) {
view.setImageResource(R.drawable.on);
} else {
view.setImageResource(R.drawable.off);
}
signal.countDown();
}
}
=================================================

Manabu

unread,
Oct 24, 2013, 12:56:56 AM10/24/13
to android-g...@googlegroups.com
以下ActivityのコードでEmulator(OS4.2)で試してみましたが、現象は再現せず
普通に画像が切り替わりました。
コードに特に違いがなければsetImageDrawableの方を試しに使ってみるとか。

image.setImageDrawable(getResources().getDrawable(R.drawable.off));

package com.example.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.widget.ImageView;

import java.util.concurrent.CountDownLatch;

public class MainActivity extends Activity {

    private ImageView mImageView;

    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mImageView = (ImageView)this.findViewById(R.id.imageView);

        mImageView.setImageResource(R.drawable.off);

        new Thread(new Runnable() {
            @Override
            public void run() {
                // 500msec後にon画像を描画
                CountDownLatch signal1 = new CountDownLatch(1);
                mHandler.postDelayed(new DrawImageView(mImageView, signal1, true), 500);
                try {
                    signal1.await();
                } catch (InterruptedException ie) {

                }
                // 500msec後にoff画像を描画
                CountDownLatch signal2 = new CountDownLatch(1);
                mHandler.postDelayed(new DrawImageView(mImageView, signal2, false), 500);
                try {
                    signal2.await();
                } catch (InterruptedException ie) {

                }
            }
        }).start();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;

ゲルググ

unread,
Oct 25, 2013, 5:56:00 AM10/25/13
to android-g...@googlegroups.com
投稿ありがとうございます。ゲルググです。

あれからいろいろ試してみました。
まずアドバイス頂いたsetImageDrawableも使ってみたのですが、切り替わりませんでした。

他にもいろいろさわってみたのですが効果がなかったため、
postDelayedではなく、TimerTaskを使ってロジックも変更して画像の切替を実現できるかどうか試してみたのですが、結果は同様。

それまではエミュレータ(AVDは遅いので、Vmware上のx86 android)にてテストしていたのですが、
実機でやると意図どおりの動きをしてくれました。

どうも動きだけ見てると、エミュレータは遅いためにタイマー処理をさせると後勝ちしてるような印象を受けました。
いくら遅くてもキューにのっかったら順番に処理してくれるもんだと思ってるのですが、、、
当初のpostDelayedのほうは実機では試していません。
こちらもSDKのソースを読んでないので断定は出来ませんが、同じかも知れません。

また新しいことが分かり次第投稿させて頂きます。

Reply all
Reply to author
Forward
0 new messages