小编wee*_*ton的帖子

为什么我一次只能从 okhttp.Response InputStream 读取 2048 个字节?

我正在使用 OkHttp GET 请求下载文件:

import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
...
OkHttpClient okClient = new OkHttpClient();
Request request = Request.Builder().url(url).get();
Response response = okClient.newCall(request).execute();
Run Code Online (Sandbox Code Playgroud)

我从响应正文中读取并用 一个 装饰它,BufferedInputStream缓冲区大小为 4096:

BufferedInputStream in = new BufferedInputStream(response.body().byteStream(), 4096);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试从缓冲区读取时,第一次读取返回 1179 个字节。之后,我一次只能读取 2048 个字节:

byte[] buffer = new byte[4096];
while (true) {
    int bytesRead = in.read(buffer); //bytesRead is always 2048, except the first read
    if (bytesRead == -1) break;
}
Run Code Online (Sandbox Code Playgroud)

几个相关问题:

  1. 什么可能导致第一次读取返回 1179 个字节?某种文件头?
  2. 为什么从InputStream被分页的读取到 2048 字节的大小,而不是BufferedInputStream包装器指定的值?
  3. 有没有办法配置OkHttpClient …

java networking android okhttp okio

5
推荐指数
1
解决办法
4222
查看次数

如何为MortarActivityScope提供一个活动,而不会在方向更改时泄露活动?

我有一个Mortar应用程序,MortarActivityScope是根范围内的第一个孩子.MortarActivityScope有一个ActivityScope,@为注入类提供一个活动:

@Module(addsTo = ApplicationModule.class, injects = {Foo.class, SomePresenter.class, AnotherPresenter.class})
public class ActivityModule {

    private final Activity activity;

    public ActivityModule(Activity activity) {
        this.activity = activity;
    }

    @Provides Activity provideActivity() {
        return activity;
    }
}

public class Foo {
    private final Activity activity;
    @Inject(Activity activity) {
        this.activity = activity;
    }
    public void doSomethingWithActivity() {
       // do stuff with activity: findViewById(), getWindow(), mess with action bar etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

这种情况很好,直到方向发生变化.在Mortar示例项目中,不会在方向更改时销毁活动范围.这可能是为了让@Singleton演示者,屏幕等能够在方向变化中持续存在.您可以在示例项目的主要活动中的onDestroy()方法中看到这一点:

@Override protected void onDestroy() {
    super.onDestroy();

    actionBarOwner.dropView(this);

    // activityScope may be null in …
Run Code Online (Sandbox Code Playgroud)

java android dagger mortar square-flow

5
推荐指数
1
解决办法
594
查看次数

标签 统计

android ×2

java ×2

dagger ×1

mortar ×1

networking ×1

okhttp ×1

okio ×1

square-flow ×1