Articles of 改造

如何在Android中使用Retrofit 2将应用程序逻辑从networking层分离出来2

我是Android和Retrofit的新手,我面临着一个问题。 我想让我的所谓的“ServerCommunication”类(singelton),所有的Retrofit魔术都完成了,它将有REST调用完成的公共方法。 我想在我的活动中使用这个“ServerCommunication”实例来调用Rest服务,但多数民众赞成它。 应用程序逻辑应该在活动中完成。 所以这样一些活动Login在ServerCommunication中调用方法Login(POJORequest),通过Retrofit框架实现REST调用并返回一些POJOResponse。所以Activity不关心REST通信,而ServerCommunication不关心什么逻辑应该应用于REST服务的响应。 随着改造2我不明白如何我可以阻止活动等待改造的反应,以及如何返回。 那么,我可能会认为我可以在活动中使用一些callback方法,所以这些方法可以在OnPostExecute()中的ServerCommunication中调用,以基于响应中的数据来应用一些逻辑,这只是我认为它应该是更简单的方法。 那么,为了澄清上面所有这些混乱想象简单的情况:你有主要活动的数据,你传递这个数据到你的通信类REST调用完成和响应收到。 此响应必须经过validation才能继续。 而且你希望这个validation在主要活动中完成,而不是在通信类中完成。 用Retrofit2在Android中做什么模式? 先谢谢你

为WebTokenauthentication改装自定义客户端

我正在使用Retrofit来处理与服务器API,API用户JSON Web令牌进行身份validation的通信。 该令牌有时到期,我正在寻找实施改造客户端的最好方法,它可以在到期时自动刷新令牌。 这是我想到的初始实现,: /** * Client implementation that refreshes JSON WebToken automatically if * the response contains a 401 header, has there may be simultaneous calls to execute method * the refreshToken is synchronized to avoid multiple login calls. */ public class RefreshTokenClient extends OkClient { private static final int UNAUTHENTICATED = 401; /** […]

如何在Retrofit中自定义响应正文JSON转换?

我正在使用Retrofit来实现一个rest客户端,当我尝试将响应主体转换为我的模型对象时遇到了一些麻烦。 我在我的界面中有以下内容: @POST("/users") void createUser(@Body RegisterUserToken token, Callback<User> callback); 我的User类基本上是POJO: public class User { private int id; private String username; private String email; private String language; // getters and setters… } 这就是我使用Rest Client的方法: restClient.createUser(token, new Callback<User>() { @Override public void success(User user, Response response) { // …problem is here, with the user object } @Override […]

改造:如何在请求中指定逗号分隔的参数?

我试图重构我的代码使用Retrofit(来自Volley)一些Foursquare API调用,但还没有find一个适当的例子,显示如何指定一个查询参数,有2个值用逗号分隔。 我的基地url如下: public static final String VENUES_BASE_URL = "https://api.foursquare.com/v2/venues"; 我的url的其余部分是这样的: "?ll=40.7,50.2&limit=50&radius=25000&v=20140909&venuePhotos=1&oauth_token=xxyyxx"; 我的界面的第一个实现: public interface Fourquare { @GET("/explore?ll={p1},{p2}&limit=50&radius=25000&v=20140905&venuePhotos=1&oauth_token=xxyyxx") Response getVenues(@Path("p1") String param1, @Path("p2") String param2); } 然后提出这样的要求: RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(ConfigConstants.VENUES_BASE_URL) .build(); Fourquare fourquare = restAdapter.create(Fourquare.class); Response myResponse = fourquare.getVenues("50", "75"); 但是,上面给了我以下错误: retrofit.RetrofitError: Fourquare.getVenues: URL query string "ll={p1},{p2}&limit=50&radius=25000&v=20140905&venuePhotos=1&oauth_token=xxyyxx" must not have replace block. […]

Android Retrofit 2.0刷新令牌

我正在使用Retrofit 2.0与Jackson转换器与Rest API进行通信。 有些请求需要授权令牌。 如果我拥有的令牌已经过时,我需要用另一个请求刷新它们,并重复上次因此而失败的请求。 我的问题:我是否需要手动每次都做,或者有什么办法来自动化? 以下是我目前实施的方式: TrackerService public interface TrackerService { @POST("auth/sendPassword") Call<ResponseMessage> sendPassword(@Header("app-type") String appType, @Body User userMobile); @FormUrlEncoded @POST("oauth/token") Call<TokenResponse> oathToken(@Field("client_id") String clientId, @Field("client_secret") String clientSecret, @Field("grant_type") String grantType, @Field("username") String username, @Field("password") String password); @FormUrlEncoded @POST("oauth/token") Call<TokenResponse> refreshToken(@Field("client_id") String clientId, @Field("client_secret") String clientSecret, @Field("grant_type") String grantType, @Field("refresh_token") String username); @PUT("me/profile") Call<Profile> […]

如何在Android中正确实现Feed(类似于Facebook / Instagram)?

我对Android非常陌生。 我正在尝试创build一个包含大量图片和元数据的社交应用程序。 它有一个类似于Facebook上的饲料的屏幕。 我想使这个屏幕尽可能平滑和标准。 下面是我使用的库:OkHttp,Picasso,Retrofit,Gson。 现在,我一次性获取所有json,因为我在后端播种了虚拟值,响应足够小。 但是,将来会有前后两个域来限制json响应。 我现在的一些问题: 我正在使用OkHttp的毕加索。 它是否caching磁盘中的图像或只在内存中? 什么是caching饲料的最佳做法? 由于大多数内容是图像,我应该让毕加索处理caching还是应该caching一些项目? 听说过JakeWharton的DiskLruCache库,但没有尝试过。 我应该去吗? 如何保持一些饲料内容(如3或4)在滚动caching的任一方向,以便滚动显示平滑,并且图像在进入视图后不会开始加载。 如何自动处理json响应使用上一个和下一个字段时,用户滚动所有的内容,在这一个去。 基本上我想触发基于光标所滚动内容的数量的请求。 假设有一个类似的button,用户点击它,我应该改变UI和旁边喜欢的数量通过发送一个POST请求更新计数器,或者我应该发送请求,并等待从服务器更新的计数器之前更新用户界面? 我已经通过了Instamaterial的源代码,并学习了一些令人惊叹的东西。 但是它并没有显示整个后端集成。 我只想知道是否有其他的开放源码的应用程序,我可以学习或从中学习。 如果你知道任何教程,也将有所帮助。 我只想让应用程序体验尽可能stream畅,并希望学习一些最佳实践。

Retrofit-IllegalArgumentException:意外的URL

我想使用Retrofit将video文件(从图库中select)上传到服务器。 但它不起作用,并抛出exception“ java.lang.IllegalArgumentException:意外url:192.168.1.7 ”。 我的代码如下。 PostFile.java : public final class PostFile { public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("vide/mp4"); private final OkHttpClient client = new OkHttpClient(); public void run(String path) throws Exception { File file = new File(path); Request request = new Request.Builder() .url("192.168.1.7/") .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file)) .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new […]

Dagger +翻新dynamicurl

问题 我需要从USERinput的域调用API,我需要在调用插入的数据之前编辑我的Retrofit单例。 有没有办法“重置”我的单身,迫使它重新创build? 要么 有没有办法更新我的baseUrl与我的数据(也许在拦截?)就在通话之前? 码 单身 @Provides @Singleton Retrofit provideRetrofit(SharedPreferences prefs) { String apiUrl = "https://%1s%2s"; apiUrl = String.format(apiUrl, prefs.getString(ACCOUNT_SUBDOMAIN, null), prefs.getString(ACCOUNT_DOMAIN, null)); OkHttpClient httpClient = new OkHttpClient.Builder() .addInterceptor(new HeaderInterceptor()) .build(); return new Retrofit.Builder() .baseUrl(apiUrl) .addConverterFactory(GsonConverterFactory.create()) .client(httpClient) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } @Provides @Singleton API provideAPI(Retrofit retrofit) { return retrofit.create(API.class); } API @FormUrlEncoded @POST("endpoint") Observable<Response> logIn(@Field("login") […]

如何使用Retrofit和OKHttp在下一个请求中使cachingpath失效/强制更新?

我正在使用Retrofit与OKHttp客户端caching来自JSON API的响应。 这很好。 但是,如果我在设备上导致数据在服务器上更新的操作,我需要一种方法来“无效”一个特定的路由,以确保下一次请求这个数据,它是从服务器,而不是现在过时的caching版本。 目前,我已经通过在请求的Cache-Control头中显式地调用新的路由来解决这个问题,但是这迫使我在需要之前下载新的数据,可能多次采取多个行动,只是为了保持caching最新。 有没有一种方法可以将我的改装/ OKhttp客户端中的路由/方法标记为caching已过期,在下次请求时需要通过networking进行强制更新?

如何执行没有返回types或callback的DELETE请求?

我需要使用Retrofit执行DELETE请求。 所以,我的界面的代码片段如下所示: @DELETE("/api/item/{id}") void deleteItem(@Path("id") int itemId); 但是我得到的错误: java.lang.IllegalArgumentException:ApiItem.deleteItem:必须具有返回types或callback作为最后一个参数。 但是,根据Rest API的规则,我不应该收到任何对DELETE请求的响应。 我应该如何在界面中指定它? 谢谢。