- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用中,我使用包含位图的模型类在 recyclerView
上显示图像
public class ImageModelClass {
Bitmap image;
public void setImage(Bitmap image) {
this.image = image;
}
public Bitmap getImage() {
return image;
}
问题是当我直接从我的模型类使用位图时,这个错误抛出Error, cannot access an invalid/free'd bitmap here!
当我将位图类替换为模型类中的字符串并使用编码位图将位图图像转换为字符串时,此错误就不会出现。
但是编码位图会花费大量时间加载图像。
public class ImageCollection extends AppCompatActivity {
public static final String IMAGE_SHARED_PREFS = "com.example.animproject_IMAGE_SHARED_PREFS";
public static final String IMAGE_DATA_KEY = "com.example.animproject_IMAGE_DATA_KEY";
private static final int REQUEST_CODE = 1;
RecyclerView recyclerView;
ImageCollectionAdapter adapter;
List<ImageModelClass> imageList;
FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_collection);
loadAlbumData();
recyclerView = findViewById(R.id.imageCollectionRecyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
adapter = new ImageCollectionAdapter(this,imageList);
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, GridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
recyclerView.setAdapter(adapter);
fab = findViewById(R.id.fabButton);
fab.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
public void onClick(View view) {
Intent gallery = new Intent(Intent.ACTION_PICK);
gallery.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
gallery.setType("image/*");
startActivityForResult(gallery, REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
assert data != null;
ClipData clipData = data.getClipData();
if (clipData != null) {
for (int i = 0; i < clipData.getItemCount(); i++) {
Uri imageUri = clipData.getItemAt(i).getUri();
InputStream inputStream;
try {
inputStream = getContentResolver().openInputStream(imageUri);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
ImageModelClass imageModelClass = new ImageModelClass();
imageModelClass.setImage(bitmap);
imageList.add(imageModelClass);
adapter.notifyDataSetChanged();
saveGalleryData();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
} else {
Uri imageUri = data.getData();
InputStream inputStream = null;
try {
assert imageUri != null;
inputStream = getContentResolver().openInputStream(imageUri);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
ImageModelClass imageModelClass = new ImageModelClass();
imageModelClass.setImage(bitmap);
imageList.add(imageModelClass);
adapter.notifyDataSetChanged();
saveGalleryData();
}
}
}
private void saveGalleryData() {
SharedPreferences preferences = getSharedPreferences(IMAGE_SHARED_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
Gson gson = new Gson();
String json = gson.toJson(imageList);
editor.putString(IMAGE_DATA_KEY, json);
editor.apply();
}
private void loadAlbumData() {
SharedPreferences preferences = getSharedPreferences(IMAGE_SHARED_PREFS, MODE_PRIVATE);
Gson gson = new Gson();
Type type = new TypeToken<ArrayList<ImageModelClass>>() {
}.getType();
String data = preferences.getString(IMAGE_DATA_KEY, null);
imageList = gson.fromJson(data, type);
if (imageList == null) {
imageList = new ArrayList<>();
}
}
适配器
public class ImageCollectionAdapter extends RecyclerView.Adapter<ImageCollectionAdapter.MyViewHolder> {
List<ImageModelClass> list;
Context context;
public ImageCollectionAdapter(Context context,List<ImageModelClass> list) {
this.list = list;
this.context = context ;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.image_collection_lists, parent, false));
}
@Override
public void onBindViewHolder(@NonNull
MyViewHolder holder, int position) {
ImageModelClass currentImage =
list.get(position);
Glide
.With(context.getApplicationContext)
.load(currentImages.getImages)
/* getting bitmap images from model
* class
*/
.into(holder.imageView);
}
@Override
public int getItemCount() {
return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
RoundedImageView imageView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.galleryPicture);
}
}
}
请帮助它会很感激:)
最佳答案
当我尝试从 textView 获取位图时,我遇到了同样的问题。 textView 位于底部工作表内的 RecyclerView 中。当我点击 textView 时,我得到了位图并关闭了底部工作表。
我从 textView 的绘图缓存中获取了位图。我使用调试器检查了位图是否已正确检索。但是当我将它传递给回调(从 recyclerView 的适配器到 Activity )时,回调中的位图没有显示在调试器中,我收到错误消息“无法在此处访问无效/免费的位图!”。
据我了解,当 textView 未在屏幕上显示/呈现时(在我的情况下,当我关闭底部工作表时)缓存的位图变得不可用。必须阅读相关文档才能了解问题的确切原因。
我为解决这个问题所做的是创建位图的副本并将其传递给回调并且成功了!
您可以像这样复制位图:
Bitmap copyBitmap = bitmap.copy(bitmap.getConfig(), false);
获取位图和创建新位图的完整代码:
holder.textView.setDrawingCacheEnabled(true);
holder.textView.buildDrawingCache();
Bitmap bitmap = holder.textView.getDrawingCache();
Bitmap copyBitmap = bitmap.copy(bitmap.getConfig(), false);
holder.textView.setDrawingCacheEnabled(false);
callback.onWidgetSelected(copyBitmap);
希望对您有所帮助。我也会确保研究文档,并在找到此问题的原因时更新答案。
关于java - 错误,无法在此处访问无效/免费的位图!使用包含位图的模型类时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62817622/
前言 俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。今天大姚给大家分享一款.NET Avalonia开源、免费、跨平台、快速的Git可视化管理工
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
正在学习有关 C 语言链接列表的教程。我已编译此代码并通过 valgrind 运行它。它显示了 4 次分配和 0 次释放,这是我理解的。我需要知道如何正确调用 free() 来释放分配。 代码示例:l
正如标题所说,我需要一个搜索引擎...用于mysql 搜索。我的网站是基于 PHP 的。 我打算使用 sphinx,但我的托管公司不支持全文索引! 所以一个没有全文的搜索引擎! 它应该是相当强大的,并
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我正在寻找稳定和成熟的免费/开源库来比较两个图像。 我找到了这个,但我想知道你是否使用更好的! Similar images finder - .NET Image processing in C#
我有一个通用链表实现,其中包含一个指向数据的 void* 的节点结构和一个包含对头的引用的列表结构。现在这是我的问题,链表中的一个节点可能通过其 void* 持有对另一个链表的引用。当我释放包含较小列
前言 今天大姚给大家分享一款开源(MIT License)、免费、现代化风格的WPF UI控件库:ModernWpf。 项目介绍 ModernWpf是一个开源项目,它为 WPF 提供了一组现代化
LiveCharts2 LiveCharts2是一个.NET开源(MIT License)、简单、灵活、交互式且功能强大的.NET图表、地图和仪表,现在几乎可以在任何地方运行如:Maui、Uno P
前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、实用的多功能原神工具箱,旨在改善桌面端玩家的游戏体验:胡桃工具箱。 工具箱介绍 胡桃工具箱是一款.NET开源(MIT
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 3年前关闭。 Improve this qu
当我这样做时,我的 meteor 应用程序运行的免费服务器的规范是什么。 meteor deploy myapp.meteor.com 规范方面 Storage size Max bandwidth
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
如果可能,我可以使用任何网络服务免费存储少量数据(考虑 XML 或 JSON)? 我想我想创建一个小型待办事项应用程序,只是探索/学习(最好是免费的),它还可以将数据备份到云端,以便他们可以在智能手机
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 2年前关闭。 Improve this qu
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
是否有任何免费/开源替代 Codesmith 可以在功能上进行比较并生成 .NET 代码? 最佳答案 几年前我做了同样的研究,发现 MyGeneration 成为 非常好。 关于.net - 免费 C
在尝试找到可以逐步执行/允许线程的haskell monad时,我发现了免费的monad data Free f a = Return a | Roll (f (Free f a)) 及其 monad
我是一名优秀的程序员,十分优秀!