最终,我找到了一种使其同时运行并更快的方法。使用此方法遇到两个问题:
我也应该通过Bitmap.Config参数,否则我无法解码字节数组_bmp.compress和_bmp.copyPixelsToBuffer给出了不同的数组,所以我不能使用解码字节数组。我这样解决了
private void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject(); if(_bmp!=null){int bytes = _bmp.getWidth()*_bmp.getHeight()*4;ByteBuffer buffer = ByteBuffer.allocate(bytes);_bmp.copyPixelsToBuffer(buffer);byte[] array = new byte[bytes]; // looks like this is extraneous memory allocationif (buffer.hasArray()) { try{array = buffer.array(); } catch (BufferUnderflowException e) {e.printstacktrace(); }}String configName = _bmp.getConfig().name();oos.writeObject(array);oos.writeInt(_bmp.getWidth());oos.writeInt(_bmp.getHeight());oos.writeObject(configName); } 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);_bmp = bitmap_tmp.copy(configBmp,true);bitmap_tmp.recycle(); } else {_bmp = null; }}
这对我来说足够快-比bmp.compress方式快15倍。希望这可以帮助 :)
解决方法我有一个实现了Serializable的TouchPoint类,因为它包含位图,所以我为该类编写了writeObject和readObject:
private void writeObject(ObjectOutputStream oos) throws IOException { long t1 = System.currentTimeMillis(); oos.defaultWriteObject(); if(_bmp!=null){int bytes = _bmp.getWidth()*_bmp.getHeight()*4;ByteBuffer buffer = ByteBuffer.allocate(bytes); _bmp.copyPixelsToBuffer(buffer);byte[] array = buffer.array();oos.writeObject(array); } Log.v('PaintFX','Elapsed Time: '+(System.currentTimeMillis()-t1));}private void readObject(ObjectInputStream ois) throws IOException,ClassNotFoundException{ ois.defaultReadObject(); byte[] data = (byte[]) ois.readObject(); if(data != null && data.length > 0){_bmp = BitmapFactory.decodeByteArray(data,data.length); }}
问题是我得到了
SkImageDecoder :: Factory返回null
那么我该如何解决。我知道可能的解决方案是将writeObject()更改为
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();_bmp.compress(Bitmap.CompressFormat.PNG,100,byteStream);oos.writeObject(byteStream.toByteArray);
但是这种方法要慢10倍以上。
copyPixelsToBuffer〜14ms用于写入图像_bmp.compress〜160ms更新 发现实际的问题是
buffer.array();
所有byte []数组元素均为:0