2016-04-19 26 views
0

私はretrofit2を使用してAndroidアプリのネットワークを処理します。 netWorkManager.getsearch()のようにネットワークを抽象化し、非同期要求とUI更新を行います。私が見たすべてのチュートリアルには、UIを更新するためのコードの@Override onResponseのコールバックのUIを更新するコードがあります(そして、これをnetworkManagerで処理したいと思います)。コールバックの返却を処理するための関数やメソッドを渡したかったのですが、私の研究では不可能ではないと思います。 retrofit2の使用について何か不足していますか?私の問題を解決するためのアイデアや、Androidでのネットワークの良好な抽象化の仕方はありますか?retrofit2抽象化ネットワークandroid

答えて

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>も抽象化することができます。