我遇到了以下问题。我想使用Volley作为模型,在Android中实现MVP。问题在于,Volley requestQueue需要上下文。我知道一个解决方法是创建静态Context,但这是一种不好的做法。那么我应该如何使用MVP创建这段代码。
RequestQueue queue = Volley.newRequestQueue(this);
我遇到了以下问题。我想使用Volley作为模型,在Android中实现MVP。问题在于,Volley requestQueue需要上下文。我知道一个解决方法是创建静态Context,但这是一种不好的做法。那么我应该如何使用MVP创建这段代码。
RequestQueue queue = Volley.newRequestQueue(this);
我建议您将网络请求完全抽象化,并创建一个处理网络请求的类。然后,您可以在创建它时创建此类。例如,在具有应用程序上下文的应用程序类中。
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
) {
. . .
}
我想我找到了答案。虽然无法保证答案的正确性,但它是有效的。
我改变了我的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);