无法获得Runnable内部更改的值

时间:2014-04-15 20:22:47

标签: java android android-handler

我有这样的代码:

time = 5;
final Handler handler = new Handler();
    Runnable runnable = new Runnable() {
           @Override
           public void run() {
               if(time == 0)
                   time = 0;
               else {
                   time --;
               }
               handler.postDelayed(this, 1000);
           }
        };

我的应用程序包含一个按钮,需要收集' time'但问题是当我点击按钮时,' time'无论何时单击按钮,总是5。我测试了它并且' time'真的减少一个,但我无法获得这个价值。

我如何才能真正体验“时间”和“时间”。单击按钮后变量?

1 个答案:

答案 0 :(得分:0)

为您的处理程序创建一个线程来处理。让线程在后台运行,但让它通过消息包将它的信息传递给你的处理程序。像这样的东西

private class HandlerThread extends Thread{
    private Handler handler;


    public HandlerThread(Handler uiHandler){
        handler = uiHandler;
    }

    public void run(){
        int time = 5;
        Bundle b;

        for(int i = 0; i < time; i++){
            b = new Bundle();
            b.putInt("time_key", time);
            Message message = handler.obtainMessage();
            message.setData(b);
            handler.postDelayed(this, 1000);
            handler.sendMessage(message);
        }                    
    }
}

然后让你的处理程序处理消息

final Handler handler = new Handler(){
    public void handleMessage(Message msg){
        Bundle b;
        b = msg.getData();

        mainUiTime = b.getInt("time_key",0))
    }
};

你可以像这样开始你的后台线程

HandlerThread handlerThread = new HandlerThread(handler);
handlerThread.start();

作为一个注释,您还需要找到一种在线程运行完毕后取消线程的方法。这通常通过创建一个布尔变量来完成,比如keepRunning,并将它作为while循环放在run()方法中;而(keepRunning)。然后在你的mainUi中,当你没有按钮时将变量更改为false,这样它就基本上终止了线程的运行部分。