Я запрограммировал Java только пару дней, так что будьте осторожны ...: P
Мое приложение использует базу данных SQLite для сохранения различных "проектов", для которых требуется предоставленный пользователем текст, фотография и местоположение.Проблема заключается в том, что при просмотре некоторых проектов возникает исключение «Недостаточно памяти» при загрузке
myImage.setImageURI (Uri.parse (msavePicture));
в четвертый пятый раз.При использовании DDMS вы можете видеть, что выделенная память увеличивается примерно на 0,2 Мбайт при каждой новой загрузке.Я искал проблему и пытался использовать
myImage.setImageDrawable (null);
, но проблема остается.Я также попытался изменить код на
myBitmap = BitmapFactory.decodeFile(msavePicture);
ImageView myImage = (ImageView) this.findViewById(R.id.camera_preview);
myImage.setImageBitmap(myBitmap);
, чтобы я мог использовать .recycle ();но картинка не загружается, она возвращает ноль.msavePicture - это строка, которая выглядит следующим образом:
file: ///mnt/sdcard/MyCameraApp/IMG_2011-12-09-01-49.jpg
iЯ включил
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
в манифест, и я знаю, что изображение существует, потому что при использовании setImageURI оно работает.
Так что вопрос: что я делаю неправильно, чтобы вызвать утечку памяти, какчтобы по-настоящему уничтожить ImageView, или почему Bitmapfactory не может декодировать мою строку, расположение файла неверно?
Я включил много действий на всякий случай.Любое решение или ссылки по этому поводу будут с благодарностью!
Заранее спасибо!
(PS: Если кто-то знает руководство по сохранению базы данных SQLite на сервере, чтобы вы могли обновить другие телефоныс этим также был бы очень признателен! =): DS)
public class Page3 extends Activity {
private static final int ACTIVITY_CREATE = 0;
public static Long Row = (long) 40;
public static String summarydec = "FAIL";
public static String msavePicture;
public static Location loc;
private EditText mgps_lati;
private EditText mgps_long;
static String gps_long;
static String gps_lati;
private TodoDbAdapter mDbHelper;
public Location myLocation;
public static Bitmap myBitmap;
public Uri uBitmap;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
mDbHelper = new TodoDbAdapter(this);
mDbHelper.open();
setContentView(R.layout.camera);
if(msavePicture == null){
msavePicture = "";
}
// myBitmap = BitmapFactory.decodeFile(msavePicture);
// ImageView myImage = (ImageView) this.findViewById(R.id.camera_preview);
// myImage.setImageBitmap(myBitmap);
ImageView myImage = (ImageView) this.findViewById(R.id.camera_preview);
myImage.setImageURI(Uri.parse(msavePicture));
mgps_long = (EditText) findViewById(R.id.gps_long);
mgps_lati = (EditText) findViewById(R.id.gps_lati);
mgps_lati.setText("Latitude: "+gps_lati);
mgps_long.setText("Longitude: "+gps_long);
////////////////////////////////////////////////////////////
///// G P S - L Y S S N A R E ////////////////////////////
////////////////////////////////////////////////////////////
MyLocation myLocation = new MyLocation();
myLocation.getLocation(this, locationResult);
Button gps = (Button) findViewById(R.id.gps);
gps.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
if (gps_lati != null && gps_long != null) {
mgps_lati.setText("Latitude: " +gps_lati);
mgps_long.setText("Longitude: " +gps_long);
TodoDetails.save_gps_long = gps_long;
TodoDetails.save_gps_lati = gps_lati;
Page1.save_gps_long = gps_long;
Page1.save_gps_lati= gps_lati;
Page2.save_gps_long = gps_long;
Page2.save_gps_lati= gps_lati;
} else {
String Latitude = "Fel vid GPS-hanteringen, arra det!";
String Longitude = "Fel vid GPS-hanteringen, arra det!";
mgps_lati.setText(Latitude);
mgps_long.setText(Longitude);
}
}});
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
Button camera = (Button) findViewById(R.id.camera);
camera.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
createCamera();
}});
Button confirmButton = (Button) findViewById(R.id.todo_edit_button);
confirmButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
setResult(RESULT_OK);
TodoDetails.mPIC = msavePicture;
Page1.mPIC = msavePicture;
Page2.mPIC = msavePicture;
ImageView myImage = (ImageView) findViewById(R.id.camera_preview);
myImage.setImageDrawable(null);
// myBitmap.recycle();
cancelTimer();
finish();
}
});
}
protected void onPause() {
super.onPause();
cancelTimer();
ImageView myImage = (ImageView) findViewById(R.id.camera_preview);
myImage.setImageDrawable(null);
}
protected void cancelTimer()
{
MyLocation myLocation = new MyLocation();
myLocation.cancelTimer();
}
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
cancelTimer();
ImageView myImage = (ImageView) findViewById(R.id.camera_preview);
myImage.setImageURI(Uri.parse(msavePicture));
// ImageView myImage = (ImageView) this.findViewById(R.id.camera_preview);
// myBitmap = BitmapFactory.decodeFile(msavePicture);
// myImage.setImageBitmap(myBitmap);
}
public void onBackPressed (){
cancelTimer();
ImageView myImage = (ImageView) findViewById(R.id.camera_preview);
myImage.setImageDrawable(null);
// Bitmap myBitmap = Page3.myBitmap;
// myBitmap.recycle();
finish();
}
////////////////////////////////////////////////////
////////////// A L L A V Y E R ///////////////////
////////////////////////////////////////////////////
private void createPage1() {
Intent b = new Intent(this, Page1.class);
startActivityForResult(b, ACTIVITY_CREATE);
setResult(RESULT_OK, b);
finish();
}
private void createPage2() {
Intent b = new Intent(this, Page2.class);
startActivityForResult(b, ACTIVITY_CREATE);
setResult(RESULT_OK, b);
}
private void createTodo() {
Intent i = new Intent(this, TodoDetails.class);
startActivityForResult(i, ACTIVITY_CREATE);
setResult(RESULT_OK, i);
}
private void createCamera() {
Intent c = new Intent(this, Camera.class);
startActivityForResult(c, ACTIVITY_CREATE);
setResult(RESULT_OK, c);
}
//////////////////////////////////////////////////////////
//////// M E N U T O O L B A R //////////////////////////
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.projektlist, menu);
return true;
}
public LocationResult locationResult = new LocationResult(){
@Override
public void gotLocation(final Location location){
gps_lati = Double.toString(location.getLatitude());
gps_long = Double.toString(location.getLongitude());
}};
}