【问题标题】:Handler /Runnable not updating ImageView and raw Resource处理程序/Runnable 不更新 ImageView 和原始资源
【发布时间】:2018-12-18 14:44:13
【问题描述】:

我最近开始了android编程,对我来说是全新的。我想在一段时间后更新sound id和drawable id,但什么都没有更新@。

我正在使用的时间:

updatetime =  mediaPlayer.getDuration();

这是活动代码:

public class Alpha_Loop extends AppCompatActivity {

ImageView abc,img1;
int i = 0;
int playsound;
Runnable Rn;
int s = 0;
long updatetime;
MediaPlayer mediaPlayer;

//Array of Image1
final int[] ImageArray = {R.drawable.a, R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e,
        R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.i, R.drawable.j, R.drawable.k,
        R.drawable.l, R.drawable.m, R.drawable.n, R.drawable.o, R.drawable.p, R.drawable.q,
        R.drawable.r, R.drawable.s, R.drawable.t, R.drawable.u, R.drawable.v, R.drawable.w,
        R.drawable.x, R.drawable.y, R.drawable.z};

//Array of Image1
final int[] img1Array = {R.drawable.apple, R.drawable.ball, R.drawable.cat, R.drawable.dog, R.drawable.egg,
        R.drawable.fish, R.drawable.goat, R.drawable.hat, R.drawable.insect, R.drawable.jar,
        R.drawable.king, R.drawable.leaf, R.drawable.monkey, R.drawable.nose, R.drawable.ocean,
        R.drawable.parrot, R.drawable.queen, R.drawable.rat, R.drawable.sun, R.drawable.tap,
        R.drawable.umbrella, R.drawable.violin, R.drawable.well, R.drawable.box, R.drawable.yatch,
        R.drawable.zebra};
//Array of wav files
final int[] Soundid = {R.raw.a, R.raw.a, R.raw.b, R.raw.c, R.raw.d, R.raw.e,
        R.raw.f, R.raw.g, R.raw.h, R.raw.i, R.raw.j, R.raw.k,
        R.raw.l, R.raw.m, R.raw.n, R.raw.o, R.raw.p, R.raw.q,
        R.raw.r, R.raw.s, R.raw.t, R.raw.u, R.raw.v, R.raw.w,
        R.raw.x, R.raw.y, R.raw.z};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.alpha__loop);
    abc = findViewById(R.id.abc);
    img1 = findViewById(R.id.img1);
    playsound = Soundid[0];
    abc.setImageResource(R.drawable.a);
    img1.setImageResource(R.drawable.apple);

   mediaPlayer = MediaPlayer.create(Alpha_Loop.this, playsound);
    mediaPlayer.start();
    mediaPlayer.setLooping(false);

    final Handler handler = new Handler();
    Rn = new Runnable() {
        @Override
        public void run() {
            abc.setImageResource(ImageArray[i]);
            i++;
            if (i >= ImageArray.length) {
                i = 0;
            }
            img1.setImageResource(img1Array[i]);
            i++;
            if (i >= img1Array.length) {
                i = 0;
            }
            playsound = Soundid[s];
            s++;
            updatetime =  mediaPlayer.getDuration();
            if (s >= Soundid.length) {
                s = 0;
            }
            handler.postDelayed(Rn, updatetime);
        }

    };
}

}

任何帮助都会对我有所帮助。

【问题讨论】:

  • 如果你在你的runnable的updatetime中添加一个断点,你会得到什么值?
  • 我正在获取最初设置的值似乎 Runable 没有执行
  • 就我而言,我认为您的代码提出了一些问题,但对我来说最重要的是 getDuration 分配给您的更新时间的毫秒值是多少。那是你告诉你的处理程序在它做任何事情之前等待的时间
  • 是的,它播放一个原始文件,我通过mediaplayer.getDuration() 获得该原始文件的持续时间,并在 Runnable 中指定更新时间
  • 我知道,我的意思是你得到的实际价值是多少。我感觉到您错过了我的断点问题,因为您以前没有使用过它们。先看看这里developer.android.com/studio/debug/#startdebug如果你想继续进行android开发,它将在很多方面帮助你(特别是developer.android.com/studio/debug/#breakPoints

标签: java android runnable android-handler


【解决方案1】:

处理程序的 postDelayed 方法中的时间,显示处理程序在调用 runnable 之前需要延迟多长时间(延迟 - 以毫秒为单位 - 直到 runnable 将被执行)。因此,在需要运行可运行程序的代码部分,调用handler.post(Rn); 来启动可运行程序。

【讨论】:

    【解决方案2】:

    如果你这样做,我很确定它会起作用:

    final Handler handler = new Handler();
    Rn = new Runnable() {
        @Override
        public void run() {
            abc.setImageResource(ImageArray[i]);
            i++;
            if (i >= ImageArray.length) {
                i = 0;
            }
            img1.setImageResource(img1Array[i]);
            i++;
            if (i >= img1Array.length) {
                i = 0;
            }
            playsound = Soundid[s];
            s++;
            updatetime =  mediaPlayer.getDuration();
            if (s >= Soundid.length) {
                s = 0;
            }
        }
    };
    handler.postDelayed(Rn, updatetime);
    

    您的处理程序正在执行 postDelayed u=in runnable 并且 runnable 因此永远不会执行。

    编辑:不要使用第一个大写字母的短名称,因为它违反 Java 命名约定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多