私はretrofit2を使用してAndroidアプリのネットワークを処理します。 netWorkManager.getsearch()
のようにネットワークを抽象化し、非同期要求とUI更新を行います。私が見たすべてのチュートリアルには、UIを更新するためのコードの@Override onResponse
のコールバックのUIを更新するコードがあります(そして、これをnetworkManagerで処理したいと思います)。コールバックの返却を処理するための関数やメソッドを渡したかったのですが、私の研究では不可能ではないと思います。 retrofit2の使用について何か不足していますか?私の問題を解決するためのアイデアや、Androidでのネットワークの良好な抽象化の仕方はありますか?retrofit2抽象化ネットワークandroid
0
A
答えて
0
同期()コールを使用するか非同期(enqueue()
)コールを使用するかによって異なりますが、不可能ではありません。
あなたがhereから知っているように、これはあなたがそれらを処理する方法である:
非同期コールの場合Call<List<Car>> carsCall = carInterface.loadCars();
try {
Response<List<Car>> carsResponse = carsCall.execute();
} catch (IOException e) {
e.printStackTrace();
//network Exception is thrown here
}
if(carsResponse != null && !carsResponse.isSuccess() && carsReponse.errorBody() != null){
// handle carsResponse.errorBody()
}
:そう
public interface RetrofitCarService {
@GET("api/getCars")
Call<List<Car>> getCars();
}
しかし、もし同じよう定義されたサービスのために
Call<List<Car>> call = service.loadCars();
call.enqueue(new Callback<List<Car>>() {
@Override
public void onResponse(Response<List<Car>> response) {
// Get result from response.body(), headers, status codes, etc
}
@Override
public void onFailure(Throwable t) {
//handle error
}
});
あなたはそれを抽象化したいと思うでしょう、このようなことを簡単に行うことができます
public interface YourCallback<T> {
void onSuccess(T t);
void onError(Throwable throwable);
}
public interface CarService {
void getCars(YourCallback<List<Car>> callback);
}
public class CarServiceImpl implements CarService {
private RetrofitCarService retrofitCarService;
public CarServiceImpl(RetrofitCarService retrofitCarService) {
this.retrofitCarService = retrofitCarService;
}
public void getCars(YourCallback<List<Car>> callback) {
retrofitCarService.getCars().enqueue(new Callback<List<Car>>() {
@Override
public void onResponse(Response<List<Car>> response) {
callback.onSuccess(response.body());
}
@Override
public void onFailure(Throwable t) {
callback.onError(t);
}
}
}
}
そして、あなたは離れて抽象化されたい:
@Inject
CarService carService;
public void something() {
carService.getCars(new YourCallback<List<Car>>() {
public void onSuccess(List<Car> cars) {
refreshDataSet(cars);
}
public void onError(Throwable throwable) {
showError(throwable);
}
});
}
これはしかし、同期と非同期の両方を表現するCall
秒の能力を離れて投げるだけでも非同期にごService
を強制することに注意してくださいオペレーション。少し考えてみると、Call<T>
も抽象化することができます。
関連する問題
- 1. Delphiの抽象化
- 2. React.jsの抽象化
- 3. ケースクラスの抽象化
- 4. Pythonの抽象化?
- 5. ORMプロバイダの抽象化
- 6. Apache VirtualHost URLの抽象化
- 7. 6抽象化、1構築
- 8. 春のキャッシュ抽象化
- 9. LINQのデータコンテキストの抽象化
- 10. スカラー:抽象クラスのインスタンス化?
- 11. RavenDB ForEach ExtensionMethod抽象化
- 12. 抽象JPA DAOで名前付きクエリを抽象化
- 13. クラスのインスタンス化を抽象化
- 14. 抽象クラス対抽象クラス
- 15. Java抽象クラス、抽象コンストラクタ
- 16. Androidはデバイスアーキテクチャを抽象化していますか?
- 17. クラスの「抽象メソッドで...抽象クラスをインスタンス化できません」
- 18. Issue @OneToManyとJPAの抽象化
- 19. ぼかしフィルタのサブ抽象化
- 20. nhibernateによる列名の抽象化
- 21. タイプクラスを抽象化できますか?
- 22. Spring 3.1キャッシュ抽象化(パラメータなし)
- 23. C#/ VB.netのデータベースエンティティとオブジェクトの抽象化
- 24. Java AppDomainのような抽象化?
- 25. 異なるORマッピングフレームワークの抽象化
- 26. AIRのデータベース抽象化レイヤー? (AS3)
- 27. データベース抽象化 - オプションは何ですか?
- 28. Backbone jsのロジックを抽象化
- 29. C++抽象型の初期化
- 30. RavenDbの設定とDocumentStoreの抽象化?