如何从Retrofit onResponse()更新Activity / Fragment UI?
我想在我的下一个Android项目中使用Retrofit 2.1.0。 我想使用设计模式,因此为每个REST调用创建单独的类,即
IBalanceService.java
public Interface IBalanceService{ @GET("users/{username}") void getUser(@Path("username") String username, Callback cb); }
BalanceRestClient.java
public class BalanceRestClient{ String username = "Makarov"; Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://hovermind.com") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(rxAdapter) .build(); IBalanceService bs = retrofit.create(IBalanceService.class); Call call = apiService.getUser(username); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { User user = response.body(); // update Activity/Fragment from here } @Override public void onFailure(Call call, Throwable t) { // Log error here since request failed } }); }
BalanceActivity.java
public BalanceActivity extends Activity{ // BalanceRestClient will update some UI elements }
如何从onResponse()更新Activity / fragment中的UI?
附加信息:
min SDK:19
目标SDK:23
用OkHttp和gson改进2.1.0
public class BalanceRestClient { private static BalanceRestClient instance; private IBalanceService request; private BalanceRestClient() { Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://hovermind.com") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(rxAdapter) .build(); request = retrofit.create(IBalanceService.class); } public static synchronized BalanceRestClient getInstance() { if (instance == null) instance = new BalanceRestClient(); return instance; } public void getRequest(String userName, YourCustomeCallback callback) { Call call = apiService.getUser(username); call.enqueue(new Callback () { @Override public void onResponse(Call call, Response response) { User user = response.body(); callback.onResponse(user); } @Override public void onFailure(Call call, Throwable t) { // Log error here since request failed } }); } }
- 创建一个单例类。 它仅初始化一次请求。
- 创建一个自定义回调,它将返回您对UI的响应。
- 调用您要使用它的BalanceRestClient.getInstance.getRequest(params ..)。
创建一个这样的界面:
public interface BalanceListener { void onUserAvailable(User user); }
在你的BalanceRestClient中有一个它的实例。 并在onResponse :
@Override public void onResponse(Call call, Response response) { User user = response.body(); listener.onUserAvailable(user); }
让您的Activity实现BalanceListner :
public class BalanceActivity extends Activity implements BalanceListener { ...... @Override public void onUserAvailable(User user) { // update user views here } }