整个应用程序的常见runonUIthread

Pra*_*eek 0 multithreading android design-patterns

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

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

为了达到同样的目的,我创建了一个ResultPoster带有一些回调方法的接口onMyResponse().

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

例如

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

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

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

-编辑-

在各种活动中使用多个这样的代码块实现相同的效果是否过分?

dir*_*ert 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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