使用 MVP 在 Android 网络请求上更新 UI

Update UI on Android networking request using MVP

我正在我的 Android 应用程序的存储库 class 中发出网络请求。我这样做是出于学习目的,所以我试图了解,如果不使用 RXJava,我将如何从我的存储库一直更新 UI?

调用路径如下 MainActivity -> Presenter -> Interactor -> Repository -> Network

这是我在存储库中的代码

WeatherRepository {
    WeatherNetwork network = new WeatherNetwork();

    public CurrentWeather getCurrentWeather(float lat, float lng) {
        network.getDailyWeather(lat, lng, new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {
                try{
                    String jsonData = response.body().string();
                    if (response.isSuccessful()) {
                        CurrentWeather currentWeather = getCurrentWeatherData(jsonData);

                    }
                }  catch(JSONException e) {
                    Log.d("DWPresen" + " JSONEXCEPTION", e.getMessage());
                } catch(IOException e){
                    Log.d("DWPresent" + " IOEXCEPTION", e.getMessage());
                }

            }
        });
    }
}

恕我直言,有两种经典方法可以做到这一点:

一种方法是将回调对象向下传递到存储库,并在您收到响应时调用回调操作。

第二种(恕我直言,更优雅)的方法是在您的应用中使用 local broadcasts。它们可用于传输消息(例如,如果您的服务中发生了某些事情并且您想通知其他线程 - 例如 UI 线程 - 关于它。)

android里面有很多关于(local) broadcasts的教程。普通广播用于应用程序之间(以及系统和应用程序之间)的通信,而本地广播可用于仅在您的应用程序内发送信息。

有一个名为 EventBus 的库非常适合 MVP 结构。

简而言之,它将事件(带有数据的对象)从一个 class 传递到另一个。在您的情况下,您可以将其中包含 CurrentWeather 对象的事件从 Repository 传递到 Presenter,然后更新 UI.