整个应用程序的常见runonUIthread

时间:2016-04-21 06:18:56

标签: android multithreading design-patterns

所以,我正在设计一个通过蓝牙加密狗与某些硬件交互的Android应用程序。

请求/响应模型有点慢(有时需要1-2秒才能收到对特定请求的响应),因此我将请求发送并将响应接收模型保存在不同的线程中。

为了达到同样的目的,我创建了一个接口ResultPoster,其中包含一些回调方法,如onMyResponse()

此界面由我的应用程序的各种Activity和UI组件实现,但我们知道我们无法直接从另一个帖子发布到 UI或Main 线程,因此我在所有UI组件中使用runOnUIthread(基本上是活动或片段)。

e.g。

runOnUiThread(new Runnable() {
@Override
public void run() {
stopProgressDialog();
launchActivity();
}
});  

现在我的代码中存在很多这样的块,并且随着某些逻辑变得复杂,它们也在增加。

现在,我想保持我的代码干净并在整个应用程序中创建一个桥梁,这将帮助我将结果从另一个线程发布到UI,只是基于我所进入的context。 你能建议我采取其他方法吗?

- 编辑 -

在各种活动中使用多个此类代码块来实现相同目标是否过分?

1 个答案:

答案 0 :(得分:5)

您可以创建一个自定义Application类,您可以在其中自己创建某种runOnUiThread方法。

它看起来像这样:

/**
 * @author Dirk Vranckaert
 */
public class MyApplication extends Application {
    private static final Handler mHandler = new Handler();

    public static final void runOnUiThread(Runnable runnable) {
        if (Thread.currentThread() == Looper.getMainLooper().getThread()) {
            runnable.run();
        } else {
            mHandler.post(runnable);
        }
    }
}

然后,从应用程序中的任何类,您应该能够调用MyApplication.runOnUiThread(new Runnable(){..});

如果你可以使用lambdas,这甚至会看起来更好。 但是你明白了,你只需要在自定义Application类中使用便捷方法,并且可以从任何地方调用它。