代码之家  ›  专栏  ›  技术社区  ›  Iter Ator

HTTP消息未正确加载(Android)

  •  0
  • Iter Ator  · 技术社区  · 4 年前

    volley 并使用下载图像 BufferedInputStream android:usesCleartextTraffic="true"

    我从截击中得到这个错误:

    com.android.volley.ParseError: org.json.JSONException: Unterminated object at character 20 of {"data":{"foo":"bar"
    

    我使用 缓冲输入流 这样地:

    private boolean getFileFromUrl(String url, String path) {
        try (BufferedInputStream in = new BufferedInputStream(new URL(url).openStream());
             FileOutputStream fileOutputStream = new FileOutputStream(path)) {
            byte dataBuffer[] = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
                fileOutputStream.write(dataBuffer, 0, bytesRead);
            }
            fileOutputStream.close();
    
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        return false;
    }
    

    Content-Length 参数,有时会出现以下错误:

    W/System.err: java.net.ProtocolException: unexpected end of stream
            at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:398)
            at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:372)
            at java.io.BufferedInputStream.fill(BufferedInputStream.java:248)
    W/System.err:     at java.io.BufferedInputStream.read1(BufferedInputStream.java:288)
    W/System.err:     at java.io.BufferedInputStream.read(BufferedInputStream.java:347)
    

    如果我没有 参数,某些文件仍未完全加载。不 IOException 引发,但如果我尝试读取一些图像,则会出现以下错误:

    <Corrupt JPEG data: premature end of data segment> from output_message
    

    这些错误是随机发生的。如果我用我的浏览器打开这些网址,它可以完美地加载它们。我不知道如何调试它。

    getFileFromUrl 用一个 https 网址,然后一切正常。不幸的是,我不能在这个项目中使用https,只有http。


    从URL获取文件 拜访 Runnable

    Executors.newFixedThreadPool(1);
    
    0 回复  |  直到 4 年前
        1
  •  3
  •   Martin Zeitler    4 年前

    看起来,API(或OkHttp客户端)出于某种原因截断了响应体。

    OkHttp客户机的读取超时时间较低(此值可能会提高),或者API没有及时响应(或作为整个JSON响应)。当它总是在web浏览器中正确响应时,它确实应该是(n Android)客户端问题。解决这个问题的一个方法就是抓住它 ProtocolException

    但我认为 Content-Length 头的值可能是错误的。
    我的意思是,如果不手动设置,这个值会被正确地计算出来。
    只有在收到错误指令时,客户才可能出现异常。

    内容长度 告诉客户端接收缓冲区的大小。。。

    Content-Length: 20 …显然是API报告的。

    {"data":{"foo":"bar"
    

    Content-Length: 22 …是API应该报告的内容。

    {"data":{"foo":"bar"}}
    
        2
  •  0
  •   GensaGames    4 年前

    从你的代码,你只是打开原始 http OpenConnection . 然而,我不确定这是正确的(也是简单的)加载图像的方法。您可以使用任何其他库进行图像加载 内容长度和标题

    • 前女友 Glide .
        Glide.with(context)
                .asBitmap()
                .load(url)
                .into(new CustomTarget<Bitmap>() {
    
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                        // do whatever you want with bitmap
                    }
    
                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {
    
                    }
                });
    
    • 要保存,只需使用上面的代码或。
    
    public void write(String fileName, Bitmap bitmap) {
      try (FileOutputStream out = new FileOutputStream(filename)) {
          bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap 
      instance
          // PNG is a lossless format, the compression factor (100) is ignored
      } catch (IOException e) {
          e.printStackTrace();
      }
    }