我们的应用程序使用最新版本的OkHttp(2.0.0)+ Okio(1.0.0)+ Picasso(2.3.2),我想在新的"Android L"模拟器(英特尔)上试用它并安装它但是当加载应用程序我得到这个:
06-27 09:47:16.214: E/AndroidRuntime(2815): FATAL EXCEPTION: main
06-27 09:47:16.214: E/AndroidRuntime(2815): java.lang.NoSuchMethodError: No static method source(Ljava/io/File;)Lokio/Source; in class Lokio/Okio; or its super classes (declaration of 'okio.Okio' appears in /system/framework/okhttp.jar)
06-27 09:47:16.214: E/AndroidRuntime(2815): at com.squareup.okhttp.internal.DiskLruCache.readJournal(DiskLruCache.java:243)
06-27 09:47:16.214: E/AndroidRuntime(2815): at com.squareup.okhttp.internal.DiskLruCache.open(DiskLruCache.java:224)
06-27 09:47:16.214: E/AndroidRuntime(2815): at com.squareup.okhttp.Cache.<init>(Cache.java:146)
06-27 09:47:16.214: E/AndroidRuntime(2815): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:74)
06-27 09:47:16.214: E/AndroidRuntime(2815): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:51)
06-27 09:47:16.214: E/AndroidRuntime(2815): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:41)
06-27 09:47:16.214: E/AndroidRuntime(2815): at com.squareup.picasso.Utils$OkHttpLoaderCreator.create(Utils.java:407)
06-27 09:47:16.214: E/AndroidRuntime(2815): at com.squareup.picasso.Utils.createDefaultDownloader(Utils.java:255)
06-27 09:47:16.214: E/AndroidRuntime(2815): at com.squareup.picasso.Picasso$Builder.build(Picasso.java:596)
Run Code Online (Sandbox Code Playgroud)
它来自使用Picasso.with(Context)创建Picasso对象.请注意,相同的代码,在没有任何更改的情况下,在之前的仿真器4.4.2(英特尔)上运行良好.
我不明白这是什么 …
我正在使用需要通过 POST 请求从 web api 获取令牌的 android 应用程序中工作,我使用的是 OkHttp 库版本 2.3.0 但奇怪的是 post 方法正在执行 GET 请求,结果我得到了 405 状态代码,这是方法不允许来自服务器的响应。
这是我的代码。
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public String executePOST(){
OkHttpClient client = new OkHttpClient();
.
.
.
.
String url = API_URL + "/oauth/access_token/";
String strResponse = null;
RequestBody body = RequestBody.create(JSON, jsonBody);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response;
try {
response = client.newCall(request).execute();
strResponse = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return …Run Code Online (Sandbox Code Playgroud) 我正在使用Retrofit进行HTTP调用.但似乎默认情况下库正在压缩(gzip)请求.由于API无法处理压缩请求,有没有办法关闭默认压缩?
我正在使用 okhttp 下载文件并且一切正常 - 现在我想显示进度并遇到障碍。返回的内容长度为 -1。它从服务器正确返回:
?> ~ curl -i http://ipfs.io/ipfs/QmRMHb4Vhv8LtYqw8RkDgkdZYxJHfrfFeQaHbNUqJYmdF2 13:38:11
HTTP/1.1 200 OK
Date: Tue, 14 Jun 2016 11:38:16 GMT
Content-Type: application/octet-stream
Content-Length: 27865948
Run Code Online (Sandbox Code Playgroud)
我在这里将问题追溯到 OkHeaders.java:
public static long contentLength(Headers headers) {
return stringToLong(headers.get("Content-Length"));
}
Run Code Online (Sandbox Code Playgroud)
我在标题中看到所有其他标题 - 但不是 Content-Length - 所以 headers.get("Content-Length") 返回 null。任何人都知道这怎么会丢失?
有趣的是,如果我将 url 更改为“ http://google.com ”,我会从 okhttp 获得内容长度 - 但是 curl 看起来都相同的内容长度 - 这真的让我感到困惑
更新:它似乎与文件的大小相关。如果我使用来自同一服务器的较小的内容,我会得到一个带有 okhttp 的 Content-Length。问题只发生在文件很大的时候
所以我在 Spring Boot 中有一个 web 应用程序,并且有一部分我向 API 发出了许多 HTTP 请求,如果发出的请求太多,它似乎会超时。我听说从同步请求切换到异步请求可能有助于解决这个问题。
使用 OkHttp,这就是我的同步 GET 请求的样子:
private JSONObject run(String url) throws Exception {
Request newRequest = new Request.Builder()
.url(url)
.addHeader("Authorization", token)
.build();
try (Response response = client.newCall(newRequest).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
return new JSONObject(response.body().string());
}
}
Run Code Online (Sandbox Code Playgroud)
我通过解析响应正文将响应作为 JSON 对象返回。但是,在尝试使用 OkHttp 异步调用时,似乎无法使用相同的方法。这是我到目前为止:
public void runAsync(String url) throws Exception {
Request request = new Request.Builder()
.url(url)
.addHeader("Authorization", token)
.build();
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Call call, IOException …Run Code Online (Sandbox Code Playgroud) 我正在学习Android,并且正在遵循有关RxJava和Dagger2的Retrofit2的一些指南。现在,我不想处理没有互联网连接的情况。我已经找到了这个答案,这似乎很不错,但是我不知道如何应用。
我有一些NetworkModule,与OkHttpClient提供商。我假设我需要OkHttpClient.Builder使用拦截器进行创建。所以它应该看起来像这样:
@Provides
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
ConnectivityInterceptor ci = new ConnectivityInterceptor(networkObservable()));
OkHttpClient.Builder.addInterceptor(ci)
return builder.build();
}
private boolean networkObservable() {
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
Run Code Online (Sandbox Code Playgroud)
这是我所没有的Context。我应该朝哪个方向-尝试在那里获取上下文,或者可能我误解了可观察对象的概念?
我正在将 Google Autocomplete Places API 与 android 一起使用,我想要做的是:
这就是为什么我需要一个单例实例,我试过这个:
public class OkHttpSingleton extends OkHttpClient {
private static OkHttpClient client = new OkHttpClient();
public static OkHttpClient getInstance() {
return client;
}
public OkHttpSingleton() {}
public void CloseConnections(){
client.dispatcher().cancelAll();
}
public List<PlacePredictions> getPredictions(){
//// TODO: 26/09/2017 do the request!
return null;
}
Run Code Online (Sandbox Code Playgroud)
}
但我不确定这是否是正确的方法,因为在文档中它说该dispatcher().cancelAll()方法取消所有请求但我知道这种方法是错误的!我更关心如何创建一个单例然后其余的。
主要活动:
Address.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多关于我的问题的问题和答案,但我仍然无法理解如何解决它。
我需要从服务器获取响应并将其存储在缓存中。之后,当设备离线时,我想使用缓存响应。当设备在线时,我想从服务器准确获取响应。
看起来没那么复杂。
这是我尝试这样做的方式(代码示例):
1)创建缓存的方法
Cache provideOkHttpCache() {
int cacheSize = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(this.getCacheDir(), cacheSize);
return cache;
}
Run Code Online (Sandbox Code Playgroud)
2)创建一个拦截器来修改缓存控制头
Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
CacheControl.Builder cacheBuilder = new CacheControl.Builder();
cacheBuilder.maxAge(0, TimeUnit.SECONDS);
cacheBuilder.maxStale(365, TimeUnit.DAYS);
CacheControl cacheControl = cacheBuilder.build();
Request request = chain.request();
if (isOnline()) {
request = request.newBuilder()
.cacheControl(cacheControl)
.build();
}
okhttp3.Response originalResponse = chain.proceed(request);
if (isOnline()) {
int maxAge = 20; …Run Code Online (Sandbox Code Playgroud) 我是新改装的,我使用的是 Retrofit2 版本 2.4.0 。有我的 Api 客户端代码:
public class ApiClient {
public static final String BASE_URL = "https://api.coinmarketcap.com/v1/";
public static Retrofit retrofit = null;
public static Retrofit getApiClient (){
if (retrofit == null){
retrofit = new Retrofit().Builder.baseUrl(BASE_URL).
addConverterFactory(GsonConverterFactory.create()).build();
}
return retrofit;
}
Run Code Online (Sandbox Code Playgroud)
}
这是我的错误:在 'retrofit2.Retrofit' 中不公开,无法从外部访问
它在代码的这一部分向我显示错误:new Retrofit().Builder
我刚刚发现,Android推荐的http客户端HttpUrlConnection不支持HTTP / 2。
是否有特定原因不在Android上使用HTTP / 2?