java - MVP 和数据加载

标签 java android multithreading android-mvp

我引用的代码来自一个与googlecodelabs/android-testing非常相似的应用程序。 .

出于多种原因,我们希望遵循 MVP 模式,因此我们希望尊重依赖反转原则,并且永远不要让 Presenter 了解 Activity 、 fragment 或任何与上下文相关的对象。

同时,我们希望 View 尽可能保持愚蠢,仅将用户交互转发给负责最终更新 View 的演示者。

一个经典的场景是,当用户按下重新加载按钮时, View 将事件转发给演示者,演示者将调用模型来获取新数据,并通过某种方式将其传递回 View .showStuff(stuff) 回调。

问题是:如何处理多线程?模型将进行网络调用,而您不想(甚至不能)在 UI 线程上执行此操作。

我所做的,但我不确定这是一个好方法(带来一些丑陋和样板)是让所有事件报告(从 View 到演示者的调用)在单独的线程上运行(每次创建一个新线程) ,这不是一个坏习惯吗?):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_articles);
    mPresenter = new ArticlesPresenter(this, Injector.provideArticlesRepository());

    new Thread(() -> {
        mPresenter.loadArticles(true);
    }).start();
}


@Override
public void onClick(View v) {
    new Thread(() -> {
        mPresenter.loadArticle(articleId);
    }).start();
}

由于 Presenter 的回调现在来自非 Ui 线程,我们需要确保所有 UI 更新都在 UI 线程上运行:

@Override
public void setProgressIndicator(boolean active) {
    runOnUiThread(() -> {
        Log.i(TAG, "set progress indicator : "+active);
        Toast.makeText(this, "progress indicator: "+active, Toast.LENGTH_SHORT).show();
    });

}

@Override
public void showArticles(Map<String, List<Article>> articles) {
    runOnUiThread(() -> {
        Log.i(TAG, "show articles, keys: " + articles.keySet());
        Toast.makeText(this, "show all articles", Toast.LENGTH_SHORT).show();
    });
}

我尝试过并且有效,但我认为我们可以做得更好。有什么建议吗?

最佳答案

你可以做得更好,但你必须使用其他东西来代替Thread。我认为现在最好的选择是

  1. RxJava2
  2. Kotlin 协程(如果您使用 kotlin)

这两种情况都可以让您摆脱可能的回调 hell 和调用 runOnUiThread

关于java - MVP 和数据加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50646513/

相关文章:

Android 没有从值文件夹中选择正确的 dimens.xml 文件

Java-从 1 - 5000 计数并将其放入 5 列

java - 强制客户端或服务器重新启动 SSL 握手(或使 SSL session 过期)

java - 获取数学表达式的每个排列

java - 在 ViewSwitcher 中切换不确定的 ProgressBar 和 Image

linux - 检查 fork() 是否安全

textview 上的 Android 动画

java - Android 中的 System.loadLibrary

mysql - 使 MySQL 客户端程序线程安全?

c# - 在多核机器上绘图