标签: okhttp

无法在'Android L'模拟器上使用OkHttp运行应用程序

我们的应用程序使用最新版本的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(英特尔)上运行良好.

我不明白这是什么 …

android picasso okhttp okio android-5.0-lollipop

2
推荐指数
1
解决办法
2480
查看次数

为什么 OkHttp post 方法发送 get 请求而不是 post 请求?

我正在使用需要通过 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)

java post android get okhttp

2
推荐指数
1
解决办法
3581
查看次数

如何在Retrofit中关闭默认压缩?

我正在使用Retrofit进行HTTP调用.但似乎默认情况下库正在压缩(gzip)请求.由于API无法处理压缩请求,有没有办法关闭默认压缩?

android okhttp retrofit2

2
推荐指数
1
解决办法
1493
查看次数

okhttp 内容长度为 -1 大文件

我正在使用 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。问题只发生在文件很大的时候

java okhttp okhttp3

2
推荐指数
1
解决办法
1352
查看次数

Java - 从 OkHttp 异步 GET 检索结果

所以我在 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)

java spring asynchronous okhttp okhttp3

2
推荐指数
1
解决办法
2356
查看次数

如何使用Dagger2提供上下文

我正在学习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。我应该朝哪个方向-尝试在那里获取上下文,或者可能我误解了可观察对象的概念?

android rx-java okhttp dagger-2 retrofit2

2
推荐指数
1
解决办法
3272
查看次数

如何创建 Singleton OkHtpp 类并处理以前的请求

我正在将 Google Autocomplete Places API 与 android 一起使用,我想要做的是:

  1. 每次用户在 EditText 中键入一个字符时,它都需要发出一个新请求来获得预测结果。
  2. 我需要取消之前的请求,因为我需要的唯一结果是用户输入的最终地址/位置。
  3. 如果位置长度小于 3 个字符,然后使用一些逻辑来清理 RecyclerView。

这就是为什么我需要一个单例实例,我试过这个:

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)

java android okhttp

2
推荐指数
1
解决办法
2193
查看次数

改造离线请求和响应

我已经阅读了很多关于我的问题的问题和答案,但我仍然无法理解如何解决它。

我需要从服务器获取响应并将其存储在缓存中。之后,当设备离线时,我想使用缓存响应。当设备在线时,我想从服务器准确获取响应。

看起来没那么复杂。

这是我尝试这样做的方式(代码示例):

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)

android caching retrofit okhttp

2
推荐指数
1
解决办法
1576
查看次数

在 'retrofit2.Retrofit' 中不公开,无法从外部访问

我是新改装的,我使用的是 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

java android retrofit okhttp retrofit2

2
推荐指数
1
解决办法
1906
查看次数

为什么Android的HttpUrlConnection不支持HTTP / 2?

我刚刚发现,Android推荐的http客户端HttpUrlConnection不支持HTTP / 2。

是否有特定原因不在Android上使用HTTP / 2?

networking android httpurlconnection okhttp http2

2
推荐指数
1
解决办法
1464
查看次数