如下图所示加载图片。已加载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
答案 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);
}
});