如何在Final runnable中获得Random Non Final变量? -Android

时间:2013-09-19 15:09:12

标签: android random time colors

在显示代码之前无法解释这一点,所以:

final int randomcolor = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256),
                rnd.nextInt(256));


    final Runnable updater = new Runnable() {
            @Override
            public void run() {


                    relativeLayout.setBackgroundColor(randomcolor);     

                    handler.postDelayed(this, 25);
                }
            }
        };

上面我有一个名为Updater的runnable ......下面我点击按钮启动它。

Button.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            handler.postDelayed(updater,2000 );

        }
    });

(我已经删除了我的大部分代码,所以这可能没有意义,为什么我要这样做。上面会创建一个无限循环,因为runnable没有任何出路...只是假设我可以摆脱它。)

解释代码

所有这些都在Oncreate()中...... 因此,在按下一个按钮后,我会在延迟两秒后启动一个Runnable ......然后,在每25毫秒间隙之后,同一个runnable一次又一次地运行直到时间结束(就像我说的,忽略这个最后一点。)

你会看到我在runnable中只做了一件事,改变了相对布局的背景颜色。

重要 ,我想要的是每25毫秒后,即每次运行runnable时,它应该将相对布局的背景颜色更改为随机的颜色。它可能看起来像一个酒鬼华丽的癫痫诱导应用程序...把理由留给我(再次)

问题是,处理程序无法进行非最终的runnable ......并且每次运行的随机变量都不能是final和final,而且final也不能同时运行。 (再读一遍)

因此,每次runnable运行时我都需要一个新的Color整数...这样每次运行时,它都会将背景颜色更改为不同的随机颜色。

我觉得这个解决方案非常简单,但我似乎无法将其解决..

任何人的想法?我怎么可能这样做?

2 个答案:

答案 0 :(得分:0)

最简单的解决方案,即使它可能不是最有效的解决方案,就是在runnable中生成颜色,如下所示:

final Runnable updater = new Runnable() {
    @Override
    public void run() {
        final int randomcolor = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256),
            rnd.nextInt(256));
        relativeLayout.setBackgroundColor(randomcolor);     
        handler.postDelayed(this, 25);
    }
};

答案 1 :(得分:0)

我告诉你这个很脏,但你可以将你的变量包装在数组或列表中。

final int[] randomColorHack = new int[1]; 
final Runnable updater = new Runnable() {
        @Override
        public void run() {
                  randomColorHack[0] = 100;
            }
        }
    };

int out = randomColorHack[0];

// out == 0;
// until your updater is ran then it will == 100;

显然,如果你想要runnables或列表:

 final List<Runnable> hackRunnable = new ArrayList<Runnable>();
 hackRunnable.put(updater);

 Button.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v) {
           handler.postDelayed(hackRunnable.get(0), 2000);
    }
 }