我正在制作一个允许用户上传自己的图像的应用程序。该应用程序最初使用R.drawable,但由于我希望用户上传自己的图像,因此必须将所有内容更改为Bitmap。
现在我遇到了一个错误,据我所知,这是因为CPU过载。在RecycleView中使用R.drawable代替Bitmaps更好吗?
这是代码:
public void addBasicDices(){
if (DicesList == null){
DicesList = new ArrayList<>();
}
if (DicesList.size() < 8){
//Clears the list to avoid having twice the amount of dices in case of being less than 8 (E.g when I update the minimum amount of basic dices, adding d100 for example)
DicesList.clear();
//Add coin to DicesList
Dice2R.add(R.drawable.coin_tail);
Dice2R.add(R.drawable.coin_head);
diceicon = BitmapFactory.decodeResource(this.getResources(), R.drawable.coin_head);
for (int i = 0; i<Dice2R.size(); i++){
diceface = BitmapFactory.decodeResource(this.getResources(), Dice2R.get(i));
Dice2.add(diceface);
}
DicesList.add(new DiceClass(diceicon, Dice2));
//Add dice4 to DicesList
Dice4R.add(R.drawable.dice4_1);
Dice4R.add(R.drawable.dice4_2);
Dice4R.add(R.drawable.dice4_3);
Dice4R.add(R.drawable.dice4_4);
diceicon = BitmapFactory.decodeResource(this.getResources(), R.drawable.dice4_4);
for (int i = 0; i<Dice4R.size(); i++){
diceface = BitmapFactory.decodeResource(this.getResources(), Dice4R.get(i));
Dice4.add(diceface);
}
DicesList.add(new DiceClass(diceicon, Dice4));
//Add dice6 to DicesList
Dice6R.add(R.drawable.dice6_1);
Dice6R.add(R.drawable.dice6_2);
Dice6R.add(R.drawable.dice6_3);
Dice6R.add(R.drawable.dice6_4);
Dice6R.add(R.drawable.dice6_5);
Dice6R.add(R.drawable.dice6_6);
diceicon = BitmapFactory.decodeResource(this.getResources(), R.drawable.dice6_6);
for (int i = 0; i<Dice6R.size(); i++){
diceface = BitmapFactory.decodeResource(this.getResources(), Dice6R.get(i));
Dice6.add(diceface);
}
DicesList.add(new DiceClass(diceicon, Dice6));
//Add dice8 to DicesList
Dice8R.add(R.drawable.dice8_1);
Dice8R.add(R.drawable.dice8_2);
Dice8R.add(R.drawable.dice8_3);
Dice8R.add(R.drawable.dice8_4);
Dice8R.add(R.drawable.dice8_5);
Dice8R.add(R.drawable.dice8_6);
Dice8R.add(R.drawable.dice8_7);
Dice8R.add(R.drawable.dice8_8);
diceicon = BitmapFactory.decodeResource(this.getResources(), R.drawable.dice8_8);
for (int i = 0; i<Dice8R.size(); i++){
diceface = BitmapFactory.decodeResource(this.getResources(), Dice8R.get(i));
Dice8.add(diceface);
}
DicesList.add(new DiceClass(diceicon, Dice8));
//Add dice10 to DicesList
Dice10R.add(R.drawable.dice10_1);
Dice10R.add(R.drawable.dice10_2);
Dice10R.add(R.drawable.dice10_3);
Dice10R.add(R.drawable.dice10_4);
Dice10R.add(R.drawable.dice10_5);
Dice10R.add(R.drawable.dice10_6);
Dice10R.add(R.drawable.dice10_7);
Dice10R.add(R.drawable.dice10_8);
Dice10R.add(R.drawable.dice10_9);
Dice10R.add(R.drawable.dice10_10);
diceicon = BitmapFactory.decodeResource(this.getResources(), R.drawable.dice10_10);
for (int i = 0; i<Dice10R.size(); i++){
diceface = BitmapFactory.decodeResource(this.getResources(), Dice10R.get(i));
Dice10.add(diceface);
}
DicesList.add(new DiceClass(diceicon, Dice10));
//Add dice12 to DicesList
Dice12R.add(R.drawable.dice12_1);
Dice12R.add(R.drawable.dice12_2);
Dice12R.add(R.drawable.dice12_3);
Dice12R.add(R.drawable.dice12_4);
Dice12R.add(R.drawable.dice12_5);
Dice12R.add(R.drawable.dice12_6);
Dice12R.add(R.drawable.dice12_7);
Dice12R.add(R.drawable.dice12_8);
Dice12R.add(R.drawable.dice12_9);
Dice12R.add(R.drawable.dice12_10);
Dice12R.add(R.drawable.dice12_11);
Dice12R.add(R.drawable.dice12_12);
diceicon = BitmapFactory.decodeResource(this.getResources(), R.drawable.dice12_12);
for (int i = 0; i<Dice12R.size(); i++){
diceface = BitmapFactory.decodeResource(this.getResources(), Dice12R.get(i));
Dice12.add(diceface);
}
DicesList.add(new DiceClass(diceicon, Dice12));
//Add dice20 to DicesList
Dice20R.add(R.drawable.dice20_1);
Dice20R.add(R.drawable.dice20_2);
Dice20R.add(R.drawable.dice20_3);
Dice20R.add(R.drawable.dice20_4);
Dice20R.add(R.drawable.dice20_5);
Dice20R.add(R.drawable.dice20_6);
Dice20R.add(R.drawable.dice20_7);
Dice20R.add(R.drawable.dice20_8);
Dice20R.add(R.drawable.dice20_9);
Dice20R.add(R.drawable.dice20_10);
Dice20R.add(R.drawable.dice20_11);
Dice20R.add(R.drawable.dice20_12);
Dice20R.add(R.drawable.dice20_13);
Dice20R.add(R.drawable.dice20_14);
Dice20R.add(R.drawable.dice20_15);
Dice20R.add(R.drawable.dice20_16);
Dice20R.add(R.drawable.dice20_17);
Dice20R.add(R.drawable.dice20_18);
Dice20R.add(R.drawable.dice20_19);
Dice20R.add(R.drawable.dice20_20);
diceicon = BitmapFactory.decodeResource(this.getResources(), R.drawable.dice20_20);
for (int i = 0; i<Dice20R.size(); i++){
diceface = BitmapFactory.decodeResource(this.getResources(), Dice20R.get(i));
Dice20.add(diceface);
}
DicesList.add(new DiceClass(diceicon, Dice20));
//Add dice100 to DicesList
Dice100R.add(R.drawable.dice100_1);
Dice100R.add(R.drawable.dice100_2);
Dice100R.add(R.drawable.dice100_3);
Dice100R.add(R.drawable.dice100_4);
Dice100R.add(R.drawable.dice100_5);
Dice100R.add(R.drawable.dice100_6);
Dice100R.add(R.drawable.dice100_7);
Dice100R.add(R.drawable.dice100_8);
Dice100R.add(R.drawable.dice100_9);
Dice100R.add(R.drawable.dice100_10);
Dice100R.add(R.drawable.dice100_11);
Dice100R.add(R.drawable.dice100_12);
Dice100R.add(R.drawable.dice100_13);
Dice100R.add(R.drawable.dice100_14);
Dice100R.add(R.drawable.dice100_15);
Dice100R.add(R.drawable.dice100_16);
Dice100R.add(R.drawable.dice100_17);
Dice100R.add(R.drawable.dice100_18);
Dice100R.add(R.drawable.dice100_19);
Dice100R.add(R.drawable.dice100_20);
Dice100R.add(R.drawable.dice100_21);
Dice100R.add(R.drawable.dice100_22);
Dice100R.add(R.drawable.dice100_23);
Dice100R.add(R.drawable.dice100_24);
Dice100R.add(R.drawable.dice100_25);
Dice100R.add(R.drawable.dice100_26);
Dice100R.add(R.drawable.dice100_27);
Dice100R.add(R.drawable.dice100_28);
Dice100R.add(R.drawable.dice100_29);
Dice100R.add(R.drawable.dice100_30);
Dice100R.add(R.drawable.dice100_31);
Dice100R.add(R.drawable.dice100_32);
Dice100R.add(R.drawable.dice100_33);
Dice100R.add(R.drawable.dice100_34);
Dice100R.add(R.drawable.dice100_35);
Dice100R.add(R.drawable.dice100_36);
Dice100R.add(R.drawable.dice100_37);
Dice100R.add(R.drawable.dice100_38);
Dice100R.add(R.drawable.dice100_39);
Dice100R.add(R.drawable.dice100_40);
Dice100R.add(R.drawable.dice100_41);
Dice100R.add(R.drawable.dice100_42);
Dice100R.add(R.drawable.dice100_43);
Dice100R.add(R.drawable.dice100_44);
Dice100R.add(R.drawable.dice100_45);
Dice100R.add(R.drawable.dice100_46);
Dice100R.add(R.drawable.dice100_47);
Dice100R.add(R.drawable.dice100_48);
Dice100R.add(R.drawable.dice100_49);
Dice100R.add(R.drawable.dice100_50);
Dice100R.add(R.drawable.dice100_51);
Dice100R.add(R.drawable.dice100_52);
Dice100R.add(R.drawable.dice100_53);
Dice100R.add(R.drawable.dice100_54);
Dice100R.add(R.drawable.dice100_55);
Dice100R.add(R.drawable.dice100_56);
Dice100R.add(R.drawable.dice100_57);
Dice100R.add(R.drawable.dice100_58);
Dice100R.add(R.drawable.dice100_59);
Dice100R.add(R.drawable.dice100_60);
Dice100R.add(R.drawable.dice100_61);
Dice100R.add(R.drawable.dice100_62);
Dice100R.add(R.drawable.dice100_63);
Dice100R.add(R.drawable.dice100_64);
Dice100R.add(R.drawable.dice100_65);
Dice100R.add(R.drawable.dice100_66);
Dice100R.add(R.drawable.dice100_67);
Dice100R.add(R.drawable.dice100_68);
Dice100R.add(R.drawable.dice100_69);
Dice100R.add(R.drawable.dice100_70);
Dice100R.add(R.drawable.dice100_71);
Dice100R.add(R.drawable.dice100_72);
Dice100R.add(R.drawable.dice100_73);
Dice100R.add(R.drawable.dice100_74);
Dice100R.add(R.drawable.dice100_75);
Dice100R.add(R.drawable.dice100_76);
Dice100R.add(R.drawable.dice100_77);
Dice100R.add(R.drawable.dice100_78);
Dice100R.add(R.drawable.dice100_79);
Dice100R.add(R.drawable.dice100_80);
Dice100R.add(R.drawable.dice100_81);
Dice100R.add(R.drawable.dice100_82);
Dice100R.add(R.drawable.dice100_83);
Dice100R.add(R.drawable.dice100_84);
Dice100R.add(R.drawable.dice100_85);
Dice100R.add(R.drawable.dice100_86);
Dice100R.add(R.drawable.dice100_87);
Dice100R.add(R.drawable.dice100_88);
Dice100R.add(R.drawable.dice100_89);
Dice100R.add(R.drawable.dice100_90);
Dice100R.add(R.drawable.dice100_91);
Dice100R.add(R.drawable.dice100_92);
Dice100R.add(R.drawable.dice100_93);
Dice100R.add(R.drawable.dice100_94);
Dice100R.add(R.drawable.dice100_95);
Dice100R.add(R.drawable.dice100_96);
Dice100R.add(R.drawable.dice100_97);
Dice100R.add(R.drawable.dice100_98);
Dice100R.add(R.drawable.dice100_99);
Dice100R.add(R.drawable.dice100_100);
diceicon = BitmapFactory.decodeResource(this.getResources(), R.drawable.dice100_100);
for (int i = 0; i<Dice100R.size(); i++){
diceface = BitmapFactory.decodeResource(this.getResources(), Dice100R.get(i));
Dice100.add(diceface);
}
DicesList.add(new DiceClass(diceicon, Dice100));
}
}
错误:
06-29 20:07:20.902 17432-17432/plusultra.customdice A/Bitmap: Error, cannot access an invalid/free'd bitmap here!
--------- beginning of crash
06-29 20:07:20.902 17432-17432/plusultra.customdice A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 17432 (ltra.customdice)
06-29 20:07:20.979 17478-17478/? A/DEBUG: Revision: '0'
ABI: 'arm64'
pid: 17432, tid: 17432, name: ltra.customdice >>> plusultra.customdice <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
06-29 20:07:22.879 13510-17490/? E/STBIntentService: send error message:data_app_native_crash;1530295642760(pkgName:plusultra.customdice;version:1.0;versionCode:1) to BBS for ANR/FC/TOMB_STONE...
答案 0 :(得分:0)
R.drawable效果更好,因为它是从备用资源文件夹限定符(l,m,h,x,xx,xxx)加载的,而从相机拍摄或从存储上传的位图可能要大得多,从而导致您遇到两个问题:
或者布局会缓慢移动,这是因为在小视图上绘制了大位图,或者在OutOfMemoryException上运行,这两个问题都可以通过对位图进行下采样来解决,如以下所示:https://developer.android.com/topic/performance/graphics/load-bitmap