【问题标题】:common runonUIthread for whole application整个应用程序的通用 runonUIthread
【发布时间】:2016-04-21 06:18:56
【问题描述】:

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

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

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

这个接口是由我的应用程序的各种Activity 和 UI 组件实现的,但是我们知道我们根本不能直接从另一个线程发布到 UI 或 Main 线程,因此我使用 @所有 UI 组件(基本上是活动或片段)中的 987654324@。

例如

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

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

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

-编辑-

在不同的活动中使用多个这样的代码块来实现相同的目标是不是有点矫枉过正?

【问题讨论】:

  • 这很容易。做一个共同的家长活动。将您的每个活动扩展到此活动,并将活动用作每个地方的上下文。或者您可以使用 Activity 上下文在不同的单独 Bean 类中执行相同操作
  • @MD 假设我创建了一个 ParentActivity,它将被我的所有应用程序活动扩展。但是,我必须在这些活动中使用runOnUIThread 方法吗?或者我们正在谈论在 ParentActivity 中只保留一个 runOnUIthread ?在这种情况下如何传递上下文,在哪里?

标签: android multithreading design-patterns


【解决方案1】:

您可以创建一个自定义应用程序类,您可以在其中自己创建某种 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() {..});

如果您可以使用 lambda,这看起来会更好。 但是您明白了,您只需在自定义 Application 类中提供方便的方法,并且可以从任何地方调用它。

【讨论】:

  • 所以基本上我有一个 runOnUIthread 方法,但有多个 new Runnable 代码?
  • 是的。这意味着您可以从您想要的任何地方(即使您没有上下文)从后台线程返回并确保代码在您的主线程上执行。正如我所提到的,如果您开始使用 lambda,您的代码会看起来更简洁,因为您可以使用 lambda 调用此方法。
  • 可以将您的 Android 项目配置为开始使用带有兼容性库的 lambda。在这里解释:zserge.com/blog/android-lambda.html 是做什么的,你编写 lambda,编译器通过内联方法的实现放回普通的旧对象创建。基本上就是这样,所以没有运行时改进,但代码更干净!
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2019-06-01
  • 2012-03-16
  • 2021-08-26
  • 2011-01-10
  • 1970-01-01
  • 2015-05-06
相关资源
最近更新 更多