Android: утечка памяти, вызывающая OOM при использовании setImageURI - PullRequest
0 голосов
/ 14 декабря 2011

Я запрограммировал 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());
        }};
 }

1 Ответ

0 голосов
/ 14 декабря 2011

Вы должны уменьшить растровое изображение до размера вашего ImageView.Например:

int ratio = widhtOriginal / widthImageView;
// Just an example, you should use more sophisticated algorithm

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = ratio;

InputStream inputStream = context.getContentResolver().openInputStream(uri);
// Will work for Uri's with "content" scheme,
// otherwise use BitmapFactory.decodeFile(String, Options) and so on

Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...