如何在Android中的getFilesDir()文件夹中加载/显示保存的图像?

时间:2016-06-23 12:44:42

标签: android bitmap imageview

如下图所示加载图片。已加载buf,包含内容,但setImageBitmap会发出警告。知道我的代码有什么问题吗? bitmap不应该是null

File file = new File(context.getFilesDir(), body + ".image");
InputStream in = new BufferedInputStream(new FileInputStream(file));
byte[] buf = new byte[(int) file.length()];
int numRead = in.read(buf);
Bitmap bitmap = BitmapFactory.decodeByteArray(buf, 0, numRead);
ImageView icon = (ImageView) view.findViewById(R.id.icon);
icon.setImageBitmap(bitmap);

SkImageDecoder :: Factory返回null

enter image description here

2 个答案:

答案 0 :(得分:0)

据我所知,Bitmap丢失了。但是你可以这样做:

try {
      File f = getFile();
      //e.g getFile can return a new File();
      if (!f.exists()) { return null; }
      Bitmap tmp = BitmapFactory.decodeFile(filename);
      return tmp;
  } catch (Exception e) {
      return null;
  }

答案 1 :(得分:0)

首先,您不创建位图(使用位图工厂,请参阅下面的代码) 你在主线程上打开并读取文件,减慢app的速度。将所有文件处理移动到单独的线程。 为此,您可以使用AsyncTask或(更好的)rxJava库的Schedulers.io()调度程序。我做这样的事情:

String body =" myFile&#34 ;;

    final Observable<Bitmap> imageSource =
    Observable.just(body)
        .map(new Func1<String, Bitmap>() {
                 @Override
                 public Bitmap call(String body) {
                     File file = new File(BetcadeApplication.this.getFilesDir(), body + ".image");
                     InputStream in = null;
                     try {
                         in = new BufferedInputStream(new FileInputStream(file));
                     }catch (FileNotFoundException e){
                         return null;
                     }
                     return BitmapFactory.decodeStream(in);
                 }
             }
        );
    Observable.defer(new Func0<Observable<Bitmap>>() {
        @Override
        public Observable<Bitmap> call() {
            return imageSource;
        }
    })
            .subscribeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Bitmap>() {
                @Override
                public void call(Bitmap bitmap) {
                    // set result here
                    //ImageView icon = (ImageView) view.findViewById(R.id.icon);
                    //icon.setImageBitmap(bitmap);
                }
            });