簡體   English   中英

如何使用Retrofit 2在Android中將應用程序邏輯與網絡層分開

[英]How to separate application logic from network layer in Android using Retrofit 2

我是Android和Retrofit的新手,我遇到了一個問題。

我想讓我的讓我們說“ServerCommunication”類(singelton),其中所有的Retrofit魔法都已完成,並且它將具有完成REST調用的公共方法。

我想在我的活動中使用這個“ServerCommunication”實例來調用Rest服務,但就是這樣。 應用程序邏輯應該在活動中完成。 所以這樣一些活動Login調用方法Login(POJORequest)在“ServerCommunication”中,通過Retrofit框架完成實際的REST調用並返回一些POJOResponse。所以Activity不關心REST通信,而ServerCommunication不關心什么邏輯應該應用於REST服務的響應。

通過改造2,我不明白如何阻止Activity等待改造的響應以及如何返回。 好吧,我可能認為我可以在活動中使用一些回調方法,因此可以從OnPostExecute()中的ServerCommunication調用這些方法,以根據響應中的數據應用一些邏輯。我認為這應該是更簡單的方法。

好吧,為了澄清上面的所有混亂,想象一下簡單的情況:你在主要活動中有數據,你將這些數據傳遞給完成REST調用並收到響應的通信類。 必須驗證此響應才能繼續。 並且您希望此驗證在主要活動中完成,而不是在通信類中完成。

使用Retrofit2在Android中執行此操作的模式是什么?

先感謝您

我通常做的事情:

  • 創建您的界面(您擁有所有REST方法 - GET和POST等)
  • 創建一個使用相應方法執行實際調用的類(請參閱接口REST方法)。 我會稱之為ServiceAPIImplementor。 這是您實際創建Retrofit適配器的地方。
  • 在您的活動中,創建實現者類的實例並調用方法並傳遞預期的參數。
  • 在調用方法之后,您應該顯示一個進度對話框,讓用戶知道某些事情正在發生。
  • 調用onResponseonFailure方法時,使用事件模式(EventBus庫?)通知活動網絡操作已完成。 一旦活動收到通知,它就應該關閉進度對話框並相應地更新UI - 使用新接收的數據或完成的操作(預期結果)。

我希望這可以幫助您更接近您想要實現的目標!

服務接口(IPhotoService):

@GET("/photos/kudos")
Call<String> fetchKudos(@Header("Authorization") String authorization,
                        @Query("offset") int offset, @Query("mt") boolean mt);

服務impl(PhotoService):

private GoApiProvider<IPhotoService> mGoProvider = new GoApiProvider<>();

public Promiser<List<Photo>, HttpError> fetchKudos() {
    return new Promiser<>((resolve, reject) ->
            mGoProvider.getService(IPhotoService.class).fetchKudos(mSession.getToken(),
                    mOffsetKudos, true).enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    if (response.isSuccessful()) {
                        PhotoParser JSON = new PhotoParser();
                        try {
                            mOffsetKudos = mOffsetKudos + 20;
                            resolve.run(JSON.photosFromJson(response.body()));
                        } catch (JSONException e) {
                            Log.e("fetchKudos", e.toString());
                        }
                    } else {
                        reject.run(new HttpError(response.code(), response.message()));
                    }
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    reject.run(new HttpError(YPErrorType.Undefined.getType(), t.getMessage()));
                }
            })
    );
}

活動或片段:

private void loadPhoto() {
    new PhotoService().fetchKudos()
            .success(this::resultSucceeded)
            .error(this::resultError);
}

private void resultSucceeded(List<Photo> photos) {
    mPhotoAdapter.setItems(photos);
}

private void resultError(HttpError httpError) {
    httpErrorToast(httpError);
}

如果你想使用Promizer: 點擊這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM