我使用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) 我需要有一个Runnable没有做任何事情的函数接口的lambda表达式.我曾经有过一种方法
private void doNothing(){
//Do nothing
}
Run Code Online (Sandbox Code Playgroud)
然后使用this::doNothing.但我发现了一个更短的方法来做到这一点.
要从其他线程更新GUI,基本上有两种主要方法:
将java.lang.Runnable与以下任何方法一起使用:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Handler.post(Runnable)
Run Code Online (Sandbox Code Playgroud)使用android.os.Message:
Handler.sendMessage(Message) / Handler.handleMessage(Message)
Run Code Online (Sandbox Code Playgroud)您也可以使用AsyncTask,但我的问题更侧重于更新非常简单的组件的用例.让我们看看如何使用这两种方法完成:
使用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)使用消息:
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)恕我直言,消息不是要走的路,因为:
另一方面,Runnables遵循众所周知的命令模式,并且更加程序员友好且可读.
那么使用Messages …
根据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_()是否可能?
我从一个方法调用:
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".
谢谢你的帮助.
我想为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上调用方法吗?
谢谢 :)
我一直认为在实现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方法?
我有一个使用处理程序发布可运行实例的线程.它工作得很好,但我很好奇如何通过params in在Runnable实例中使用?也许我只是不明白这个功能是如何工作的.
为了抢先"你为什么需要这个"问题,我有一个线程动画,必须回调到UI线程,告诉它实际绘制的内容.
我试过这种方式:
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中制作一个简单的计时器,每秒更新一次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)