Articles of 改造

Android rxJava使用改造进行error handling

我正在使用较新的RX java而不是 Observable.create(new Observable.OnSubscribeFunc() {…}); 使用:(由于弃用) Observable.create(new Observable.OnSubscribe() {…}); (这可能很重要,因为大多数示例,教程,explonation使用旧的……) 好吧,让我们看看我的问题。 我有一个Java类,它的相关部分: private interface ApiManagerService { @FormUrlEncoded @POST(“/login”) User getUser(@Field(“username”) String userName, @Field(“password”) String password); } private static RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(HOST) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); private static ApiManagerService apiManager = restAdapter.create(ApiManagerService.class); public static Subscription login(final String userName, final String password, Observer observer) { return […]

IntentService中的数据库操作导致应用程序停止,变得无响应并给出ANR

我在警报管理器中使用IntentService每15秒触发一次。 我必须不断向服务器发送大量数据并在后台接收大量数据。 我必须遵循以下流程: 我正在通过查询从数据库中读取数据。 然后在Json中通过POJO架构转换它。 使用Retrofit Library将此JSON请求发送到服务器。 接收数据作为回应。 如果数据库中有任何更新,则通过某些查询将此数据插入我的数据库。 有替代方法吗? 因为我正面临着ANR。 如果数据较少,则其工作正常。 但随着数据量变大,UI暂停,应用程序变得无法响应。

如何使用改造将成功的Response主体转换为特定types?

在异步模式下改装调用 public void success(T t, Response rawResponse) t是转换后的响应,rawResponse是原始响应。 这使您可以访问原始响应和转换后的响应。 在同步模式下,您可以获得转换后的响应或原始响应 转换后的反应 @GET(“/users/list”) List userList(); 原始回应 @GET(“/users/list”) Response userList(); Response对象确实有一个获取正文的方法 TypedInput getBody() 而改装api确实有一个转换器类,可以将其转换为java对象 Object fromBody(TypedInput body,Type type) 但我无法弄清楚如何获取Converter对象的实例 我或许可以创建一个Converter类的实例,但这需要知道用于创建RestAdapter的Gson对象,我可能无法访问它。 理想情况下,我想直接获取对RestAdpater的转换器对象的引用。 以下任何一个都会回答我的问题: 有没有办法获得改造使用的默认转换器的引用? 有谁知道如何构造默认的转换器? (没有默认构造函数,有两个构造函数public GsonConverter(Gson gson)和public GsonConverter(Gson gson,String charset) 有没有其他方法可以同步模式下获取原始响应和转换响应?

你如何防止Retrofit自动跟随302

我有一个身份validation调用,我正在尝试使用Android上的Retrofit。 该调用将302返回到成功或失败页面。 原始302响应会返回维护身份validation成功所需的会话cookie,但是在我有机会使用cookie之前,Retrofit会自动将请求移交给重定向URL。 有没有办法阻止重定向? 或者有没有办法在Retrofit上编写响应处理程序,可以在进行第二次调用之前添加适当的标头?

使用GSON调整改造响应

我希望通过从特定API收到的每个成功响应,以非常方式检索已知JSON对象的子元素。 每个服务器响应都返回以下JSON格式(为简单起见,精简): { “status”: “success”, “error_title”: “”, “error_message”: “”, “data”: { “messages”: [ { “message_id”: “123”, “content”: “This is a message” }, { “message_id”: “124”, “content”: “This is another message” } ] } } 错误响应包含相同的通用格式,“data”对象为空,错误相关的JSON对象包含有用的值。 在出现错误的情况下,我想提取与错误相关的JSON对象。 通过上面的响应,我有一个MessageResponse类,它包含status,errorTitle和errorMessage String属性以及MessageData对象。 然后MessageData对象包含消息List messages – List messages 。 在这种情况下获取消息的我的GET方法如下(为简单起见,简化): @GET(“/chat/conversation”) void getMessages(Callback callback); 如果我坚持使用GSON的串行器提供的默认POJO映射,那么这种设计需要每个响应types有三个类。 我的最终目标是通过仅从成功的服务器响应中读取我需要的内容并忽略其余类来减少所需的类的数量。 我希望我所有的成功,这个API上的回调数据types尽可能接近“数据”内容。 换句话说,我想非常地返回“数据”的子元素。 在上面的例子中,它是一个名为“messages”的数组,但在某些其他响应中,它可能是一个“用户”对象,例如。 我知道这可以通过为每种响应types注册单独的TypeAdapter来完成,但我希望通过使用单个通用解决方案来实现我的最终目标。 […]

通过Retrofit 2 Asynchronous下载时是否可以显示进度条?

@Streaming @GET Call downloadSong(@Url String url); 上面的代码用于使用改造来异步下载文件。 我想得到下载的进度,如果有任何暂停/恢复的可能性,请回答

处理RxJava中的APIexception

我目前正试图绕过RxJava,但我在处理服务调用exception方面遇到了一些麻烦。 基本上,我有一个(Retrofit)服务返回一个Observable 。 ServiceResponse的定义如下: public class ServiceResponse { private int status; private String message; private JsonElement data; public JsonElement getData() { return data; } public int getStatus() { return status; } public String getMessage() { return message; } } 现在我想要的是将该generics响应映射到数据JsonElement字段中包含的List (我假设你不关心Account对象的样子,所以我不会用它来污染post)。 以下代码适用于成功案例,但我找不到处理APIexception的好方法: service.getAccounts() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(new Func1() { @Override public AccountData call(ServiceResponse serviceResponse) { // […]

javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚

我正在使用Retrofit来访问我的REST API。 但是,当我把我的API放在ssl后面并通过http://myhost/myapi访问它时,我收到此错误: 我的API落后于SSL后,我是否需要做一些额外的事情? 这是我如何连接: private final String API = “https://myhost/myapi”; private final RestAdapter REST_ADAPTER = new RestAdapter.Builder() .setServer(API) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); 01-10 09:49:55.621 2076-2100/com.myapp.mobile D/Retrofit﹕ javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:401) at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209) at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478) at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282) at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497) at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134) at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90) at […]

使用Retrofit方法更具表现力的方式

我想使void enqueue(Callback callback); 方法调用代码块更具表现力,这是我通常所拥有的 request.enqueue(object : Callback { override fun onFailure(call: Call?, t: Throwable?) { // } override fun onResponse(call: Call?, response: Response?) { // } }) 而想要和意思是,更改此代码阻止更清洁的方式并删除那些覆盖,对象,回调关键字并执行类似的操作: request.enqueue({throwable, response -> }) 我认为可以使用扩展和高阶函数以某种方式进行改进。 有谁知道怎么做?

GSON忽略错误types的元素

我正在使用Retrofit(与OkHttp和GSON结合使用)与在线Web服务进行通信。 webservice有一个默认的包装器,它的响应类似于: { “resultCode”:”OK”, “resultObj”:”Can be a string or JSON object / array”, “error”:””, “message”:”” } 在此示例中, resultCode将为OK或NO 。 此外,在处理请求时发生错误时, error和message仅包含任何内容。 最后,但并非最不重要的是, resultObj将包含调用的实际结果(在示例中是一个字符串,但有些调用返回JSON数组或JSON对象)。 为了处理这个元数据,我创建了一个generics类,如下所示: public class ApiResult { private String error; private String message; private String resultCode; private T resultObj; // + some getters, setters etcetera } 我还创建了表示有时在resultObj给出的响应的类,并且我已经定义了一个与Retrofit一起使用的接口,看起来有点像这样: public interface SomeWebService { @GET(“/method/string”) ApiResult someCallThatReturnsAString(); […]