Я пытаюсь сохранить ArrayList<Plant>
(myPlantList
) в файл с помощью этого метода.
public static void savePlants(Context c){
try {
FileOutputStream fOS = c.openFileOutput("plantArrList", c.MODE_PRIVATE);
ObjectOutputStream oOS = new ObjectOutputStream(fOS);
oOS.writeObject(myPlantList);
oOS.close();
fOS.close();
} catch (IOException io) {
io.printStackTrace();
}
}
Я получаю сообщение об ошибке (это не приводит к сбою приложения) java.io.NotSerializableException: android.graphics.drawable.BitmapDrawable
. Можно с уверенностью предположить, что BitmapDrawable, на который он ссылается, это Plant.image
. Как мне сериализовать это ArrayList<Plant>
, включая изображения растений. Я читал о сжатии BitMapDrawables
с помощью метода .compress
, но я не понимаю, как я мог бы сделать это для каждого Plant
, сохраняя при этом файл ArrayList<Plant>
в 1.
Вот соответствующая часть класса Plant
.
public class Plant implements Serializable{
private String name;
private String date;
private Drawable image;
private String waterFrequency;
public Plant(String n, Drawable i, String wF){
this.name = n;
Date time = Calendar.getInstance().getTime();
this.date = MyApplication.gson.toJson(time);
this.image = i;
this.waterFrequency = wF;
}
}
РЕДАКТИРОВАТЬ: Drawable получается из камеры. Снимок сделан с помощью камеры и сохранен как Drawable в newPlant
Activity (ниже).
public class newPlant extends AppCompatActivity implements OnClickListener {
private ImageButton plantCam;
private FloatingActionButton savePlant;
private EditText newPlantName;
private EditText newPlantWF;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.newplant);
plantCam = (ImageButton)findViewById(R.id.newPlantImage);
savePlant = (FloatingActionButton)findViewById(R.id.savePlant);
newPlantName = findViewById(R.id.newPlantName);
newPlantWF = findViewById(R.id.newPlantWF);
plantCam.setOnClickListener(this);
savePlant.setOnClickListener(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Bitmap bitmap = (Bitmap)data.getExtras().get("data");
plantCam.setImageBitmap(bitmap);
}
public void onClick(View v){
switch(v.getId()){
case R.id.newPlantImage:{
Log.d("plantCam", "clicked");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,0);
break;
}case R.id.savePlant:{
Log.d("SavePlant", "clicked");
Plant temp = new Plant(newPlantName.getText().toString(), plantCam.getDrawable(), newPlantWF.getText().toString());
Log.d("plantBeingAdded", temp.toString());
MyApplication.myPlantList.add(temp);
MyApplication.savePlants(this);
Log.d("SavePlant", "finished saving plant" + MyApplication.myPlantList.toString() + " end list");
finish();
break;
}
}
}
}