Android MVP架构与Volley库的结合

3

我遇到了以下问题。我想使用Volley作为模型,在Android中实现MVP。问题在于,Volley requestQueue需要上下文。我知道一个解决方法是创建静态Context,但这是一种不好的做法。那么我应该如何使用MVP创建这段代码。

RequestQueue queue = Volley.newRequestQueue(this);

你应该使用依赖注入库,如Koin或Dagger来注入上下文。 - reixa
不,这不是不良做法。你可以在应用程序类中创建它,并在不同的地方使用它。 - Squti
2个回答

0

我建议您将网络请求完全抽象化,并创建一个处理网络请求的类。然后,您可以在创建它时创建此类。例如,在具有应用程序上下文的应用程序类中。

class NetworkRequest(
    private val context: Context
) {
    val queue = Volley.newRequestQueue(context)

    fun doNetworkRequest() {
        val request = StringRequest(...)
        queue.add(request)
    }
}

class Presenter(
    private val networkRequest: NetworkRequest
) {
    . . .
}

通过模拟 NetworkRequest 和请求服务器的实现细节,您可以测试您的 Presenter,从而将服务器请求的抽象化与您的演示逻辑分离。

0

我想我找到了答案。虽然无法保证答案的正确性,但它是有效的。

我改变了我的Presenter构造函数,现在我应该隐式地将正确的视图传递给Presenter,因为在我的应用程序启动时,我传递的是一个片段而不是一个视图。这就是为什么我在MainView接口中创建了setPresenter方法。

 public MainPresenter(MainContract.MainView view, NetworkLayer networkLayer) {
    this.view = view;
    this.view.setPresenter(this);
    this.networkLayer = networkLayer;
}

现在我正在应用程序启动时(在MainActivity或Application类中)设置NetworkLayer。在那里,我可以访问应用程序上下文,并且可以传递网络层而不必在Presenter中存储上下文。为了使Presenter和Model之间建立正确的连接,我创建了一个setter在NetworkLayer中传递正确的Presenter。

    MainFragment mainFragment = new MainFragment();
    //Inject view and model
    MainContract.MainPresenter mainPresenter = new MainPresenter(mainFragment, NetworkLayer.getInstance(getApplicationContext()));
    NetworkLayer.getInstance(getApplicationContext()).setPresenter(mainPresenter);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接