使用参数从runnable更新ui

ar5n3qh5  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(278)

我在stackoverflow上找到了多种方法来实现这一点,但仍然没有找到一种使用参数的好方法。在我的例子中,我有一个线程需要不断地用日志信息更新ui主线程(我没有使用asynctask;我正在从googleMap实现tileprovider接口)
这就是我在线程中运行的东西,它可以工作:

Handler mainHandler = new Handler(Looper.getMainLooper());
...

public void debugMsg(final String msg)
{
   Runnable myRunnable = (new Runnable()
   {
     @Override
     public void run()
     {
        Log.Add(msg); // static function that update the UI in the main thread
     }
   });

  mainHandler.post(myRunnable);
}

问题是,如果我理解正确,每次调用debugmsg时,它都会示例化一个新的可运行对象。我不认为这是一个很好的实践,特别是因为它将被大量地完成,所以我想知道是否有办法重用线程中的runnable。或者有更好的方法。。。

rwqw0loc

rwqw0loc1#

如果你想重复使用 Runnable ,您可以轻松地将其存储为成员变量。

private Runnable myRunnable = new Runnable() {
    @Override
    public void run() { ... };
}

您可能会认为,在有参数的情况下,可以使用consumer。

private Consumer<String> myConsumer = (str) - > { Log.d("tag", str); };

然后在debugmsg中

mainHandler.post(() -> { myConsumer.accept(msg); });

但是,lambda仍然是每次运行时示例化的函数接口的对象 debugMsg . 但是,主要的逻辑将不会被重新创建和修改 myConsumer 将被重新使用。
升级版本:
您可以自己实现runnable接口,比如

public abstract class ParameterisedRunnable implements Runnable {

    public String param = "";

    public void setParam(String str) {
        param = str;
    }
}

然后创建parameterisedrunnable的示例,就像常规的runnable(重写run方法)一样。

private ParameterisedRunnable myRunnable = new ParameterisedRunnable() {
    @Override
    public void run() {
        Log.d("tag", param);
    }
}

你就可以这样使用它了。

myRunnable.setParam(msg);
mainHandler.post(myRunnable);

相关问题