0

この質問の回答を使用して機能する実装を取得しようとしましたが、さまざまなエラーが発生し、現在 EOFException になっており、デバッグ時にファイルが書き込まれていないようです。

目標は、URL から画像をダウンロードして内部キャッシュに保存し、後でそのキャッシュから取得して表示することです。どこで間違ったのですか?CachedImage.java の次の行で EOFException がスローされます。byte[] data = (byte[]) ois.readObject();

CachedImage.java

package com.example.droid;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;

import android.graphics.Bitmap;

public class CachedImage implements Serializable {
  private static final long serialVersionUID = -12345678987654321L;
  private transient Bitmap _bmp;

  public CachedImage(Bitmap bmp) {
    this._bmp = bmp;
  }

  public void writeObject(ObjectOutputStream oos) throws IOException {
    oos.defaultWriteObject();

    if (this._bmp != null) {
      int bytes = this._bmp.getWidth() * this._bmp.getHeight() * 4;

      ByteBuffer buffer = ByteBuffer.allocate(bytes);
      this._bmp.copyPixelsToBuffer(buffer);

      if (buffer.hasArray()) {
        try {
          String configName = this._bmp.getConfig().name();

          byte[] array = buffer.array();

          oos.writeObject(array);
          oos.writeInt(this._bmp.getWidth());
          oos.writeInt(this._bmp.getHeight());
          oos.writeObject(configName);
        } catch (BufferUnderflowException e) {
        }
      }
    } else {
      oos.writeObject(null);
    }
  }

  private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
    ois.defaultReadObject();

    byte[] data = (byte[]) ois.readObject();
    if (data != null) {
      int w = ois.readInt();
      int h = ois.readInt();
      String configName = (String) ois.readObject();

      Bitmap.Config configBmp = Bitmap.Config.valueOf(configName);
      Bitmap bitmap_tmp = Bitmap.createBitmap(w, h, configBmp);
      ByteBuffer buffer = ByteBuffer.wrap(data);

      bitmap_tmp.copyPixelsFromBuffer(buffer);

      this._bmp = bitmap_tmp.copy(configBmp, true);

      bitmap_tmp.recycle();
    } else {
      this._bmp = null;
    }
  }
  public Bitmap getBitmap() {
    return this._bmp;
  }
}

呼び出しをトリガーするコード セグメントは次のとおりです。

画像が URL からフェッチされ、画像が内部に書き込まれるときの非同期コールバック関数:

@Override
protected void onPostExecute(Bitmap result) {
  if (result != null) {
      FileOutputStream output = null;
      ObjectOutputStream oos = null;
      try {
        output = ICEApplication.getAppContext().openFileOutput(filename, Context.MODE_PRIVATE);
        oos = new ObjectOutputStream(output);
        CachedImage cachedImage = new CachedImage(result);
        oos.writeObject(cachedImage);
      } catch (Exception e) {
        Log.d("DEBUG", "Exception: " + e.getMessage());
      } finally {
        if (output != null) {
          try {
            oos.close();
            output.close();
          } catch (IOException e) {
          }
        }
      }
    }
  }

ダウンロードして保存した後、ディスクからイメージを読み取るコード:

Bitmap image = null;
FileInputStream input = null;
ObjectInputStream ois = null;
try {
  input = ICEApplication.getAppContext().openFileInput(urldisplay);
  ois = new ObjectInputStream(input);
  CachedImage cachedImage = (CachedImage)ois.readObject();

  image = cachedImage.getBitmap();
} catch (Exception e) {
  Log.d("DEBUG", "Exception: " + e.getMessage());
  return null;
} finally {
  if (input != null) {
    try {
      ois.close();
      input.close();
    } catch (IOException e) {

    }
  }
}
4

1 に答える 1

1

http://www.javablogging.com/what-are-writeobject-and-readobject-customizing-the-serialization-process/から読みました

ObjectOutputStream はリフレクションを使用して、それらのメソッドが宣言されているかどうかを確認します。getPrivateMethod を使用するため、ObjectOutputStream で使用するには、これらのメソッドをプライベートに宣言する必要があります。

したがって、CachedImage のメソッド writeObject を private に変更します (パブリックとして投稿したため)。

于 2014-07-17T18:53:50.617 に答える