gpt4 book ai didi

java - MVP 和数据加载

转载 作者:行者123 更新时间:2023-12-01 19:53:03 25 4
gpt4 key购买 nike

我引用的代码来自一个与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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com