标签: runnable

如何在Java中迭代HashMap值时替换它们

我使用Runnable每秒从玩家冷却时间自动减去20,但我不知道如何在迭代它时替换值的值.如何让它更新每个键的值?

public class CoolDownTimer implements Runnable {
    @Override
    public void run() {
        for (Long l : playerCooldowns.values()) {
            l = l - 20;
            playerCooldowns.put(Key???, l);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

java hashmap runnable

53
推荐指数
3
解决办法
5万
查看次数

Lambda完全没有做任何事情

我需要有一个Runnable没有做任何事情的函数接口的lambda表达式.我曾经有过一种方法

private void doNothing(){
    //Do nothing
}
Run Code Online (Sandbox Code Playgroud)

然后使用this::doNothing.但我发现了一个更短的方法来做到这一点.

java lambda runnable java-8

47
推荐指数
3
解决办法
2万
查看次数

更新GUI:Runnables vs Messages

要从其他线程更新GUI,基本上有两种主要方法:

  1. 将java.lang.Runnable与以下任何方法一起使用:

    Activity.runOnUiThread(Runnable)
    View.post(Runnable)
    View.postDelayed(Runnable, long)
    Handler.post(Runnable)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用android.os.Message:

    Handler.sendMessage(Message) / Handler.handleMessage(Message)
    
    Run Code Online (Sandbox Code Playgroud)

您也可以使用AsyncTask,但我的问题更侧重于更新非常简单的组件的用例.让我们看看如何使用这两种方法完成:

  1. 使用Runnables:

    TextViev tv = ...;
    final String data = "hello";
    Runnable r = new Runnable() {
    
        @Override
        public void run(){
            tv.setText(data);
        }
    
    };
    //Now call Activity.runOnUiThread(r) or handler.post(r), ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用消息:

    Message m = handler.obtainMessage(UPDATE_TEXT_VIEW, "hello");
    handler.sendMessage(m);
    
    //Now on handler implementation:
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == UPDATE_TEXT_VIEW){
                String s = (String) msg.obj;
                tv.setText(data);
            } ... //other IFs?
        }
    
    Run Code Online (Sandbox Code Playgroud)

恕我直言,消息不是要走的路,因为:

  • 对于新的非android程序员来说并不容易理解(在构造期间处理程序挂钩到它的线程).
  • 如果消息跨越进程边界,则对象有效负载应为Parcellable.
  • 消息被重用(如果没有正确清理,则容易出错?)
  • 处理程序具有双重角色(它发送消息,但也处理它们)
  • 消息属性是公共的,但也提供getter/setter.

另一方面,Runnables遵循众所周知的命令模式,并且更加程序员友好且可读.

那么使用Messages …

user-interface android message runnable

46
推荐指数
3
解决办法
8845
查看次数

java Runnable run()方法返回一个值

根据java doc,Runnable方法void run()不能返回值.我不知道是否有任何解决方法.

其实我有一个调用的方法:

public class Endpoint{
    public method_(){
       RunnableClass runcls = new RunnableClass();
       runcls.run()
    }
}
Run Code Online (Sandbox Code Playgroud)

wheren方法run()是:

public class RunnableClass implements Runnable{

    public jaxbResponse response;
        public void run() {
            int id;
            id =inputProxy.input(chain);
            response = outputProxy.input();

        }
}
Run Code Online (Sandbox Code Playgroud)

我想要访问response变量method_()是否可能?

java runnable

42
推荐指数
4
解决办法
7万
查看次数

removeCallbacks不会停止runnable

我从一个方法调用:

myHandler.postDelayed(mMyRunnableHide, 6000);
Run Code Online (Sandbox Code Playgroud)

哪个叫:

public Runnable mMyRunnableHide = new Runnable()
{

    public void run()
    {
        mTextDisplay.setText("");
        DisplayX();
    }
 };
Run Code Online (Sandbox Code Playgroud)

如果点击屏幕上的按钮,我想停止runnable:

   Button next = (Button) findViewById(R.id.Breaction);
    next.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {

            myHandler.removeCallbacks(mMyRunnableHide);

            mTextDisplay.setText("");
            DisplayX();
            }
        });   
    }
Run Code Online (Sandbox Code Playgroud)

removecallbacks不会停止runnable.我究竟做错了什么?我使用的方法是否正确?我只是希望当用户单击按钮时runnable为"Not Run".

谢谢你的帮助.

android runnable

37
推荐指数
3
解决办法
3万
查看次数

创建和使用匿名Runnable类的最佳方法

我想为runnable使用匿名类.有两种方法,但我不知道他们是否做同样的事情:

方法一:直接使用Runnable和call run

new Runnable() {
    @Override
    public void run() {
    }
}.run();
Run Code Online (Sandbox Code Playgroud)

方法二:创建一个匿名的runnable,并使用start方法而不是run来粘贴到Thread:

new Thread(new Runnable() {
    @Override
    public void run() {
    }
}).start();
Run Code Online (Sandbox Code Playgroud)

我认为方法二显然是正确的.但是,我不知道它是否与方法一相同?我们可以Runnable直接在Runnable上调用方法吗?

谢谢 :)

java multithreading runnable

36
推荐指数
4
解决办法
7万
查看次数

你应该同步run方法吗?为什么或者为什么不?

我一直认为在实现Runnable的java类中同步run方法是多余的.我试图找出人们为什么这样做:

public class ThreadedClass implements Runnable{
    //other stuff
    public synchronized void run(){
        while(true)
             //do some stuff in a thread
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它似乎是多余的和不必要的,因为它们正在为另一个线程获取对象的锁.或者更确切地说,他们明确表示只有一个线程可以访问run()方法.但是由于它的run方法,它本身不是自己的线程吗?因此,只有它可以访问自己,它不需要一个单独的锁定机制?

我在网上发现了一个建议,通过同步run方法,你可以创建一个事实上的线程队列,例如:

 public void createThreadQueue(){
    ThreadedClass a = new ThreadedClass();
    new Thread(a, "First one").start();
    new Thread(a, "Second one, waiting on the first one").start();
    new Thread(a, "Third one, waiting on the other two...").start();
 }
Run Code Online (Sandbox Code Playgroud)

我个人永远不会这样做,但它提出了为什么有人会同步run方法的问题.任何想法为什么或为什么不应该同步run方法?

java multithreading synchronization synchronized runnable

34
推荐指数
1
解决办法
4万
查看次数

有没有办法将参数传递给Runnable?

我有一个使用处理程序发布可运行实例的线程.它工作得很好,但我很好奇如何通过params in在Runnable实例中使用?也许我只是不明白这个功能是如何工作的.

为了抢先"你为什么需要这个"问题,我有一个线程动画,必须回调到UI线程,告诉它实际绘制的内容.

java multithreading android runnable

34
推荐指数
3
解决办法
6万
查看次数

Android:如何停止Runnable?

我试过这种方式:

private Runnable changeColor = new Runnable() {
   private boolean killMe=false;
   public void run() {
       //some work
       if(!killMe) color_changer.postDelayed(changeColor, 150);
   }
   public void kill(){
       killMe=true;
   }
};
Run Code Online (Sandbox Code Playgroud)

但我无法访问kill()方法!

android runnable

33
推荐指数
3
解决办法
8万
查看次数

Android在Thread和Runnable中更新TextView

我想在Android中制作一个简单的计时器,每秒更新一次TextView.它只是像扫雷一样计算秒数.

问题是,当我忽略tvTime.setText(...)(使其//tvTime.setText(...),在logcat中会打印以下数量的每一秒.但是,当我想设置这个数字为TextView(在另一个Thread中创建),程序崩溃.

有谁知道如何轻松解决这个问题?

这是代码(启动时调用方法):

private void startTimerThread() {
    Thread th = new Thread(new Runnable() {
        private long startTime = System.currentTimeMillis();
        public void run() {
            while (gameState == GameState.Playing) {
                System.out.println((System.currentTimeMillis() - this.startTime) / 1000);
                tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000));
                try {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    th.start();
}
Run Code Online (Sandbox Code Playgroud)

编辑:

终于我明白了.对于那些感兴趣的人来说,这是解决方案.

private void startTimerThread() {       
    Thread th = new Thread(new Runnable() {
        private long startTime = System.currentTimeMillis();
        public void run() {
            while (gameState …
Run Code Online (Sandbox Code Playgroud)

multithreading android textview runnable

33
推荐指数
2
解决办法
6万
查看次数